14

data.tablesを使用して左結合マージを実行しようとしています。パッケージの説明は、

すべての結合で、列の名前は関係ありません。xのキーの列が順番に結合されます

使用できることを理解し.data.table[data.table:::merge.data.table

私が欲しいのは:キーを指定してXとYをマージする(ベースマージのby.xとby.yのように、->なぜこれを取り除くのですか?)

私が持っているとしましょう

DT = data.table(x=rep(c("a","b","c"),each=3),y=c(1,3,6),v=1:9,key="x,y,v")
DT1 = data.frame(x1=c("aa","bb","cc"),y1=c(1,3,6),v1=1:3,key="x1,y1,v1")

そして私はこの出力が欲しいです:

#data.table:::merge is masking I don't know how to call the base version of merge anymore
R) {base::merge}(DT,DT1,by.x="y",by.y="y1") 
y x v x1 v1
1 1 a 1 aa  1
2 1 c 7 aa  1
3 1 b 4 aa  1
4 3 a 2 bb  2
5 3 b 5 bb  2
6 3 c 8 bb  2
7 6 b 6 cc  3
8 6 a 3 cc  3
9 6 c 9 cc  3

使用して非常に満足してい[ますdata.table:::mergeが、変更しないオプションが必要ですDTDT1列名を変更し、mergeを呼び出して元に戻すなど)

4

3 に答える 3

9

更新:data.table v1.9.6(2015年9月19日リリース)以降、merge.data.table()引数by.x=とを受け入れ、適切に処理しますby.y=。以下に参照されているFR(現在は閉じられています)への更新されたリンクを次に示します。


はい、これはまだ実装されていない機能リクエストです:

FR#2033by.xとby.yをmerge.data.tableに追加します

それを妨げるものは何もありません。行われなかっただけのこと。私はめったに必要mergeとせず、より一般的にその有用性を実現するのに時間がかかりました。mergeパフォーマンスの高速化は順調に進んでX[Y]おり、この機能のリクエストが最優先されます。もっと早くそれを望むなら、あなたはそれらの引数をに追加してmerge.data.table自分で変更をコミットすることを歓迎します。ソースコードを短くして1つの関数/ファイルにまとめようとしているので、ソースを確認することで、merge.data.tableソースをたどって何をする必要があるかを確認できます。

于 2012-12-28T16:18:45.553 に答える
5

引数by.xby.yは、の開発バージョンで使用できるようになりましたdata.tableここを参照してください。devtools::install_github("Rdatatable/data.table", build_vignettes = FALSE)の開発バージョンをインストールするために使用しdata.tableます。

于 2015-05-30T06:23:34.940 に答える
4

by列はcolnames(DT)とcolnames(DT1)の共通部分にある必要があるためできません

 if (!all(by %in% intersect(colnames(x), colnames(y)))) {
       stop("Elements listed in `by` must be valid column names in x and y")
   }

ここでは、コピーせず、非常に高速なsetnamesを使用しています

setnames(DT1,'y1','y')
> merge(DT,DT1)
   y x v x1 v1
1: 1 a 1 aa  1
2: 1 b 4 aa  1
3: 1 c 7 aa  1
4: 3 a 2 bb  2
5: 3 b 5 bb  2
6: 3 c 8 bb  2
7: 6 a 3 cc  3
8: 6 b 6 cc  3
9: 6 c 9 cc  3

data.tableバージョンdata.table1.9.4で更新を編集します

パラメータを設定する必要がありbyます。そうしないと、エラーが発生します。

Error in merge.data.table(DT, as.data.table(DT1)) : 
  Elements listed in `by` must be valid column names in x and y

あなたは次のようなことをする必要があります:

merge(DT,DT1,by="y")
于 2012-12-28T13:19:08.443 に答える