5

3 つのデータ テーブルがあるとします。

dt1<-data.table(Type=c("a","b"),x=1:2)
dt2<-data.table(Type=c("a","b"),y=3:4)
dt3<-data.table(Type=c("c","d"),z=3:4)

それらを1つのデータテーブルにマージしたいので、これを行います:

dt4<-merge(dt1,dt2,by="Type") # No error, produces what I want
dt5<-merge(dt4,dt3,by="Type") # Produces empty data.table (0 rows) of 4 cols: Type,x,y,z

代わりにこのように dt5 を作成する方法はありますか?:

> dt5
   Type x y z
1:    a 1 3 NA
2:    b 2 4 NA
3:    c NA NA 3
4:    d NA NA 4
4

2 に答える 2

8

列にある一意の値が事前にわかっている場合は、その方法でテーブルを使用して結合Typeできます。このように、何に参加するかがわかるように、各テーブルのキーを設定する必要があります...Jdata.tabledata.table

#  setkeys
setkey( dt1 , Type )
setkey( dt2 , Type )
setkey( dt3 , Type )


#  Join
dt1[ dt2[ dt3[ J( letters[1:4] ) , ] ] ]
#   Type  x  y  z
#1:    a  1  3 NA
#2:    b  2  4 NA
#3:    c NA NA  3
#4:    d NA NA  4

これは、邪悪なdata.tableの複合クエリ (つまり) を示しています。dt1[dt2[dt3[...]]]

キー列の一意の値が事前にわからない場合は、テーブルのリストを作成し、lapplyそれらを使用してすばやく実行し、式を作成するための一意の値を取得できますJ...

#  A simple way to get the unique values to make 'J',
#  assuming they are in the first column.
ll <- list( dt1 , dt2 , dt3 )
vals <- unique( unlist( lapply( ll , `[` , 1 ) ) )
#[1] "a" "b" "c" "d"

次に、以前と同じように使用しますdt1[ dt2[ dt3[ J( vals ) , ] ] ]

于 2013-11-11T09:10:16.520 に答える
8

allあなたが への議論を探求している間merge、私はまたあなたに考慮したいかもしれない代替案を提供します:

Reduce(function(x, y) merge(x, y, by = "Type", all = TRUE), list(dt1, dt2, dt3))
#    Type  x  y  z
# 1:    a  1  3 NA
# 2:    b  2  4 NA
# 3:    c NA NA  3
# 4:    d NA NA  4
于 2013-11-11T05:07:10.187 に答える