通过参数连接data.table

pe-*_*rry 0 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)
Run Code Online (Sandbox Code Playgroud)

我想加入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
Run Code Online (Sandbox Code Playgroud)

但是,我没有使用内部[]的操作data.tablemerge?我累了

merge(dx, dy, by = "a", all = TRUE)
Run Code Online (Sandbox Code Playgroud)

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

dy[dx,on="a"]
Run Code Online (Sandbox Code Playgroud)

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

dx[, merge(dy, by = "a"), by = c("a", "b")]
Run Code Online (Sandbox Code Playgroud)

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

dx[, merge(.SD, dy, by = "a"), by = c("a", "b")]
Run Code Online (Sandbox Code Playgroud)

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

我怎么能这样做呢?

谢谢!

Kum*_*lam 12

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

merge(dx, dy, by = "a", all = TRUE, allow.cartesian=TRUE)
Run Code Online (Sandbox Code Playgroud)

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


Din*_*esh 2

如果我正确理解了您的要求,您可以使用直接合并选项,

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)
Run Code Online (Sandbox Code Playgroud)

它给出了您提到的所需输出。 如何连接(合并)数据框(内部、外部、左、右)?

我希望它能消除您的疑虑,如果没有,我很抱歉。

  • 尝试这个命令希望它可以解决你的问题 dx[dy,allow.cartesian = TRUE] (6认同)