2015-03-31 72 views
1

我想合并以下数据表合并两个数据表有两个ID变量和NA值

dt1 <- data.table(id = letters[1:5], day = 1, var1 = c(2,5,8,7,9), var2 = c(5,5,8,6,7), key = "id") 
dt2 <- data.table(id = letters[3:7], day = 2, var1 = c(1,7,6,6,3), var2 = c(2,3,3,2,1), key = "id") 

和结果应包括每个ID,每个工作日。不幸的是,一些ID不会在几天内出现。

id day var1 var2 
a 1 2 5 
a 2 NA NA 
b 1 5 5 
b 2 NA NA 
c 1 8 8 
c 2 1 2 
d 1 7 6 
d 2 7 3 

我已经尝试设置idday作为两个DT键。通过下面的代码,我不设法让day 2的id因为实际上它缺少,并且变量增加一倍(var1.x var1.y)

merge(dt1, dt2, by= c("id","day"), all=TRUE) 
merge(dt1, dt2, by= c("day","id"), all=TRUE) 

allow.cartesian也不起作用。任何人对如何获得我需要的决赛桌有任何想法/评论?

+1

你确定你不是简单地想要合并行吗?尝试如果'rbindlist(list(dt1,dt2))'做你想做的。 – 2015-03-31 20:22:13

回答

1

尝试

library(data.table) 
dcast(melt(rbind(dt1, dt2), id=c('id', 'day')), 
     id+day~variable, value.var='value', drop=FALSE) 
# 1: a 1 2 5 
# 2: a 2 NA NA 
# 3: b 1 5 5 
# 4: b 2 NA NA 
# 5: c 1 8 8 
# 6: c 2 1 2 
# 7: d 1 7 6 
# 8: d 2 7 3 
# 9: e 1 9 7 
#10: e 2 6 3 
#11: f 1 NA NA 
#12: f 2 6 2 
#13: g 1 NA NA 
#14: g 2 3 1 

或者作为@BramVisser评论,更换rbind(dt1, dt2)与​​

或者另一种方法,而无需使用melt/dcast

rbindlist(list(dt1, dt2))[, if(.N <2) .SD[c(.N, .N+1)] else .SD, id][, 
    day:=replace(day, is.na(day), setdiff(1:2,na.omit(day))) , id][] 

或者

setkey(rbindlist(list(dt1, dt2)), id, day)[CJ(id=unique(id), day=unique(day))]