我有两个data.table dx和dy
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.table或merge?我累了
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)
上面的代码将为您提供所需的输出.
如果我正确理解了您的要求,您可以使用直接合并选项,
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)
它给出了您提到的所需输出。 如何连接(合并)数据框(内部、外部、左、右)?
我希望它能消除您的疑虑,如果没有,我很抱歉。