1. ホーム
  2. r

[解決済み] data.tableにby引数で結合する

2022-02-15 02:29:39

質問

私は2つのdata.tableを持っています dxdy

dx <- data.table(a = c(1,1,1,1,2,2), b = 3:8)
dy <- data.table(a = c(1,1,2), c = 7:9)

参加したい dy の各行に dx そして、以下のような出力が期待されます。

data.table(plyr::ddply(dx, c("a", "b"), function(d) merge(d, dy, by = "a")))
    a b c
 1: 1 3 7
 2: 1 3 8
 3: 1 4 7
 4: 1 4 8
 5: 1 5 7
 6: 1 5 8
 7: 1 6 7
 8: 1 6 8
 9: 2 7 9
10: 2 8 9

しかし、このままでは、(1)の中の操作だけで出力することができません。 []data.table または merge ? 私は疲れている

merge(dx, dy, by = "a", all = TRUE)

vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, .)) でエラー。 結合結果は10行になります。9行以上 = nrow(x)+nrow(i). iのキー値が重複していないか、それぞれがxの同じグループに何度も何度もジョインしていないかチェックします。もしそれがOKなら、by=.EACHIで各グループに対してjを実行し、大きな割り当てを回避する。このままでよいのなら、allow.cartesian=TRUEで再実行します。そうでない場合は、FAQ、Wiki、Stack Overflow、datatable-helpでこのエラーメッセージを検索し、アドバイスをもらってください。

dy[dx,on="a"]

vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, .)) でエラー。 結合結果は10行になります。9行以上 = nrow(x)+nrow(i). iのキー値が重複していないか、それぞれがxの同じグループに何度も何度もジョインしていないかチェックします。もしそれがOKなら、by=.EACHIで各グループに対してjを実行し、大きな割り当てを回避する。このままでよいのなら、allow.cartesian=TRUEで再実行します。そうでない場合は、FAQ、Wiki、Stack Overflow、datatable-helpでこのエラーメッセージを検索し、アドバイスをもらってください。

dx[, merge(dy, by = "a"), by = c("a", "b")]

エラー in is.data.table(y) : 引数 "y" is missing, with no default

dx[, merge(.SD, dy, by = "a"), by = c("a", "b")]

merge.data.table(.SD, dy, by = "a") でエラーが発生しました。 にリストされている要素 by は、x と y の有効な列名でなければなりません。

実際にどうすればいいのでしょうか?

ありがとうございます。

解決方法は?

お客様の要件を正しく理解しているのであれば、使用できる直接のマージ・オプションがあります。

dx <- data.table(a = c(1,1,2,2), b = 3:6)
dy <- data.table(a = c(1,1,2), c = 7:9)
merge(x = dx, y = dy, by = "a", all = TRUE)

これで、おっしゃるとおりの出力が得られます。 データフレームを結合(マージ)する方法(内側、外側、左、右)?

あなたの疑問が解ければいいのですが、そうでなければ申し訳ありません。