通过参数连接data.table

时间:2016-04-01 06:38:56

标签: r data.table

我有两个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

但是,我无法仅使用[]data.table的{​​{1}}内的操作进行输出?我累了

merge

vecseq中的错误(f __,len __,if(allow.cartesian || notjoin ||!anyDuplicated(f__,:   将结果加入10行;超过9 = nrow(x)+ nrow(i)。检查i中的重复键值,每个键值一次又一次地连接到x中的同一组。如果没关系,请尝试= .EACHI为每个组运行j以避免大量分配。如果您确定要继续,请使用allow.cartesian = TRUE重新运行。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。

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

vecseq中的错误(f __,len __,if(allow.cartesian || notjoin ||!anyDuplicated(f__,:   将结果加入10行;超过9 = nrow(x)+ nrow(i)。检查i中的重复键值,每个键值一次又一次地连接到x中的同一组。如果没关系,请尝试= .EACHI为每个组运行j以避免大量分配。如果您确定要继续,请使用allow.cartesian = TRUE重新运行。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。

dy[dx,on="a"]

is.data.table(y)出错:缺少参数“y”,没有默认值

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

merge.data.table(.SD,dy,by =“a”)出错:   dx[, merge(.SD, dy, by = "a"), by = c("a", "b")] 中列出的元素必须是x和y中的有效列名

我怎么能这样做?

谢谢!

2 个答案:

答案 0 :(得分:8)

由于多个1,错误即将来临。在默认合并中,即data.frames的实现,默认为allow.cartesian=TRUE。但是在data.table实现中,情况并非如此。因此,如果您运行以下代码,它将为您提供合并输出。

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

上面的代码将为您提供所需的输出。

答案 1 :(得分:1)

如果,我理解你的要求,你可以使用直接合并选项,

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)

它提供了您提到的所需输出。 How to join (merge) data frames (inner, outer, left, right)?

如果没有,我希望它能清除你的怀疑,我是太棒了。