合并两个长度不同的数据集会在R中引发错误
我试图合并两个长度不同的合并两个长度不同的数据集会在R中引发错误,r,data.table,R,Data.table,我试图合并两个长度不同的数据集/datatable,但我经常会遇到以下错误 Error in `[.data.table`(y, xkey, nomatch = ifelse(all.x, NA, 0), allow.cartesian = allow.cartesian) : retFirst must be integer vector the same length as nrow(i) 我无法理解错误消息的含义。有人能帮忙吗? 我正在使用以下代码进行合并: merge(x=R
数据集/datatable
,但我经常会遇到以下错误
Error in `[.data.table`(y, xkey, nomatch = ifelse(all.x, NA, 0), allow.cartesian = allow.cartesian)
:
retFirst must be integer vector the same length as nrow(i)
我无法理解错误消息的含义。有人能帮忙吗?
我正在使用以下代码进行合并:
merge(x=Red,y=Error,by=c("loopN","TYPE"),all.x=TRUE)
datatable data:
数据表红色
时间型环差
11/26/2014 0:45 28808 141126 0
11/26/2014 1:00 28808 141126 0
11/26/2014 1:15 28808 141126 0
11/26/2014 1:30 28808 141126 0
11/26/2014 1:15 189379 141126 0
11/26/2014 1:30 189379 141126 0
11/26/2014 2:15 189379 141126 0
11/26/2014 1:00 239188 141126 0
11/26/2014 1:15 239188 141126 0
11/26/2014 1:30 239188 141126 0
11/26/2014 13:30 239188 141126 0
数据表错误
loopN类型V1
141126 28808 -2.932
141126 28808 -2.932
141126 28808 -2.932
141126 28808 -2.932
141126 189379 1.061
141126 189379 -1.182
141126 189379 4.771
141126 239188 -0.163
141126 239188 -1.573
141126 239188 -1.981
141126 239188-1.981
你打算做的事情似乎很奇怪。您的data.tableRED
有4条记录,分别为TYPE=28808
和loopN=141126
。类似地,data.tableERROR
也有4条记录,它们是TYPE
和loopN
的组合。因此,合并(join)将生成16个记录。如果你的整个1MM记录数据表是这样的,那么结果将是巨大的。如果这真的是你想要的,这个就可以了
RED <- structure(list(TIME = c("11/26/2014 0:45", "11/26/2014 1:00", "11/26/2014 1:15", "11/26/2014 1:30", "11/26/2014 1:15", "11/26/2014 1:30", "11/26/2014 2:15", "11/26/2014 1:00", "11/26/2014 1:15", "11/26/2014 1:30", "11/26/2014 13:30"), TYPE = c(28808L, 28808L, 28808L, 28808L, 189379L, 189379L, 189379L, 239188L, 239188L, 239188L, 239188L), loopN = c(141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L), diff = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("TIME", "TYPE", "loopN", "diff"), class = "data.frame", row.names = c(NA, -11L))
ERROR <- structure(list(loopN = c(141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L, 141126L), TYPE = c(28808L, 28808L, 28808L, 28808L, 189379L, 189379L, 189379L, 239188L, 239188L, 239188L, 239188L), V1 = c(-2.932, -2.932, -2.932, -2.932, 1.061, -1.182, 4.771, -0.163, -1.573, -1.981, -1.981)), .Names = c("loopN", "TYPE", "V1"), class = "data.frame", row.names = c(NA, 11L))
# you start here...
library(data.table)
setkey(setDT(ERROR),loopN,TYPE)
setkey(setDT(RED),loopN,TYPE)
result <- ERROR[RED, allow.cartesian=TRUE]
RED请提供一个可复制的示例。Avinash的意思是:如果您能给我们一些示例数据,这将非常有用。为您的应用程序添加了数据表示例数据reference@Leo这是一个错误。更正了错误。@Kaushal,您介意使用dput(您的数据表)提供您的数据样本吗?这是(我所知道的)使你的例子可复制的最好方法。我没有让你对“结果”有什么看法……而且我不需要16条记录。它应该是4条记录,其中RED和ERROR datatable中的LoopN和TYPE应该匹配。它更像是sql的左外连接,带有红色和错误。假设RED
只有前4条记录,与ERROR
相同。那么这两个表的所有记录都将具有完全相同的类型
和loopN
。您会将<代码>红色
中的哪个记录与<代码>错误中的哪个记录相匹配?任何联接(左、右、笛卡尔)都会将红色
中的每条记录与错误
中的每条记录相匹配,因此结果中有16个匹配项和16行。