0

約 50 個の csv ファイルを読み込んでいます (同じ命名規則、同じ構造、各ファイルは約 150k 行です)。さらに、すべてのファイルをマージしたいのですが、各行の元のソースを識別できるようにしたいと考えています。

これまでの私の解決策は、list.files に基づいてすべてのデータを読み込み、それらを rbindlist および idcol 引数と一緒にマージすることでした。しかし、元のdata.tableの名前を取るようにidcol引数を設定するのに問題があります。さらに、テーブルを rbindlist の有効なリストとして定義するのに苦労しています。

    #get filenames + path
    temp=list.files(path="C:/LocalData",pattern="RV_*",full.names=TRUE)

    #get filenames without path
    temp2=list.files(path="C:/LocalData",pattern="RV_*",full.names=FALSE)

    # get a substring of names to create a new list for the tbl names
    filenames=sapply(temp2,function(x) substr(x,1,5)) 

    #read in all files via fread and store it as an own data.table
    for (i in 1:length(temp)) assign(filenames[i], fread(temp[i])) 

    #now bring all data.tables together and create a new column that indicates the source
    RV=rbindlist(as.list(filenames),idcol = TRUE)
      Error in rbindlist(as.list(filenames), idcol = TRUE) : 
      Item 1 of list input is not a data.frame, data.table or list

    #if I state the dts individually it works
    RV=rbindlist(list(RV_v1,RV_v2,RV_v3,RV_v4,RV_v5),idcol = TRUE)

「filenames」変数に基づいて rbindlist のリストを定義するにはどうすればよいですか?

さらに、新しく作成された id 列に数値のみを含める代わりに、元の data.table の値、たとえば RV_v1 と RV_v2 を取得したいのですが、どうすればそれを達成できますか?

> RV[6:15]
    .id Identifier Name       Value
 1:   1          F   AF 68,77523568
 2:   1          G   AG 30,28675331
 3:   2          A   AA 71,38992413
 4:   2          B   AB 86,87556292
 5:   2          C   AC 60,81629287
 6:   2          D   AD 5,815721308
 7:   2          E   AE  11,9030038
 8:   2          F   AF 56,28142304
 9:   2          G   AG 3,291405727
10:   3          A   AA 59,62673465
> 

In R, add NEW column to MULTIPLE df using df namesで同様の質問が既に提起され、回答されています が、私はそれを何らかの方法で変更することができなかったので、それは私にとってはうまくいくでしょう..

私の問題を再現できるようにするために、5 つの csv ファイルのサンプルをアップロードしました。https://www.dropbox.com/s/qst2rgjkb0kpori/RVs.zip?dl=0 よろしくお願いします!

編集:フランクの提案による

rbindlist(lapply(setNames(temp, substr(temp2, 1, 5)), fread), idcol=TRUE)

私がやりたかったことをするのにうまくいきます。どうも!

4

0 に答える 0