【问题标题】:Merging two data tables with two id variables and NA values合并具有两个 id 变量和 NA 值的两个数据表
【发布时间】:2015-03-31 19:54:55
【问题描述】:

我想合并以下数据表

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

我尝试将id 和day 设置为DT 的键。通过以下几行,我无法为id 获得day 2,因为它实际上丢失了,并且变量加倍(var1.x var1.y)

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

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

【问题讨论】:

  • 您确定您不想简单地合并行吗?试试rbindlist(list(dt1, dt2)) 是否符合您的要求。

标签: r join merge data.table


【解决方案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) 替换为rbindlist(list(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))]

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 2014-04-15
    • 2023-02-22
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多