2016-11-12 11 views
1

私はいくつかの大きな(.30万行以上の).csvを取り組んでいます。 Excelにインポートして一意の値を取得/取得するには大きすぎるため、PowerShellで連結するのに数時間かかることがあります。私はそれらについて進歩を遂げてきましたが、それらをマージする2つの問題と、(独立した)行内の重複を取り除くこととの2つの問題に遭遇しました。いずれかのいずれかの助けが素晴らしいだろう!関係者には、以下に挙げる副作用は確認されていませんが、関連することさえないかもしれませんが、書式を完全に説明するためにそれらを含めると便利だと考えました。彼らは形式になりましたねヘッダーなしの.csvをUIDで結合し、PowerShellまたはRStudioの行内の重複を取り除く

drugs.csv問題が1、マージ(組み合わせ)

10005323,rituximab,rituximab,rituximab,tocilizumab,methotrexate,methotrexate,prednisone,abatacept,certolizumab pegol,etanercept 
10005479,rituximab,tocilizumab 
11848415,(1-43)-(18-2)-blood-coagulation factor viii (synthetic human) fusion protein with immunoglobulin g/1 (synthetic human fc domain fragment)?,(1-73)-(18-22)-blood-coagulation factor/viii (synthetic human) fusion protein with immunoglobulin g/1 (synthetic human fc domain fragment)? 

sideeffects.csv

10005323,asthenia,bronchitis,cholecystitis,cholelithiasis,gastroenteritis,hypertension,lung disorder,pterygium 
10005513,dengue fever,feeling hot,headache,osteoarthritis,pain,pruritus,pyrexia,rash macular,weight increased,wrong technique in product usage process 
10005479,chest pain,larynx irritation,urticaria 

によってユニークな識別子、ヘッダなし

各行の先頭にある番号は、各エントリの一意のIDで、その後に薬物のリストが続きます。彼らは区切られていますが、他にもかなりの文字があります。ヘッダーはありません。

最初の問題は、.csvファイルをマージすることです。私はsecond.csvの副作用のラインを関連する薬のラインに貼り付ける必要があります。私はこれを行う方法に関する多くの例を見つけましたが、それらはすべてヘッダー名を使用して結合することに関連しているようです。ここにヘッダーはなく、各行の長さはケースごとに異なります。一致する個々のヘッダーを指定するのではなく、最初の区切り値を指定してから行の残りの部分を指定して、PowerShellの行全体を結合する方法はありますか?例えば。独立した行に存在する除去重複は

出力例1

10005323,rituximab,rituximab,rituximab,tocilizumab,methotrexate,methotrexate,prednisone,abatacept,certolizumab,pegol,etanercept,asthenia,bronchitis,cholecystitis,cholelithiasis,gastroenteritis,hypertension,lung disorder,pterygium 

通報2第二の問題は、各ある:与える薬物10005323のリスト上ケース10005323の副作用をタッキング行は現在ソートされておらず、複数のエントリを含んでいます。例えば10005323を開始する行にはリツキシマブが数回含まれています。

私が見てきたほとんどの同様の解決策は、すべての行から重複を同時に削除しようとします(例えば、2行目のリツキシマブも削除します; 10005479)、または行全体を削除するか、指定する。しかし、私は、他のものとは無関係に、各行のユニークなエントリを取得する必要があります。ファイルがマージされた後に一意のIDを保持することは完全には必要ではありませんが、各行の最初の位置に保持できると便利です。私は、これは「ソート|-getのユニークな」になると思うの操作が、私は与えることを行ごとにそれを適用する方法を見つけ出すことはできません。

出力例Rで2

10005323,abatacept,asthenia,bronchitis,certolizumab,cholecystitis,cholelithiasis,etanercept,gastroenteritis,hypertension,lung disorder,methotrexate,pegol,prednisone,pterygium,rituximab,tocilizumab 
10005479,chest pain,larynx irritation,rituximab,tocilizumab,urticaria 
+0

データベースの使用を検討しましたか? –

+0

1)Rに読み込まれると複数のcsvに列名を与えることができます(2)長さの違いは問題ではありません - Rは欠落している列をNAとして読み込みます。 CSV全体で列の順序が同じでない場合は、一度に1つずつ読むだけではなく、列に適切な名前を付けて結合する以外にも、多くのオプションがありません。 (3)小さなデータセットで再現可能な例を投稿して、人々が問題を解決するためにコードを工夫できるようにする必要があります。それは、SOの 'R'質問への回答を得る最速の方法です。 – vagabond

答えて

0

# read data 
dr=read.csv("drugs.csv", header = F, stringsAsFactors = F) 
se=read.csv("sideeffects.csv", header=F,stringsAsFactors = F) 

# rename first column as id 
colnames(dr)[1] <- "id"; 
colnames(se)[1] <- "id"; 

#load needed libs 
library(reshape2) 
library(sqldf) 

#transpose data from columns to rows 
drColsToRows=melt(dr, id=c("id")) 
seColsToRows=melt(se, id=c("id")) 

#remove empty rows and deduplicate/concat and order by (to get alphabetical order of elements) 
drDedup=sqldf("select id, group_concat(distinct value) dr from (select * from drColsToRows order by value) where value<>'' group by id") 
seDedup=sqldf("select id, group_concat(distinct value) se from (select * from seColsToRows order by value) where value<> '' group by id") 

# join two data sets on id column 
merged=merge(drDedup, seDedup, by="id", all=TRUE) 

#concatentate drugs with sideeffect 
mergedConcat=sqldf("select id, trim(ifnull(dr,'')||','||ifnull(se,''),',') from merged") 

#save output 
write.table(mergedConcat, "out.txt", row.names=FALSE, col.names=FALSE, sep=",",quote = F) 
+0

クイック返信arturroありがとう、あなたのソリューションは完璧に動作します! – bg49ag

関連する問題