合并错误:负长度的矢量不准
我试图合并两个data.frames,它们是象下面这样:合并错误:负长度的矢量不准
GVKEY YEAR coperol delta vega firm_related_wealth
1 001045 1992 1 38.88885 17.86943 2998.816
2 001045 1993 1 33.57905 19.19287 2286.418
3 001045 1994 1 48.54719 16.85830 3924.053
4 001045 1995 1 111.46762 38.71565 8550.903
5 001045 1996 1 218.89279 45.59413 17834.921
6 001045 1997 1 415.61461 51.45863 34279.515
和
GVKEY YEAR fracdirafter fracdirafterindep twfracdirafter
1 001004 1996 1.00 0.70 1.000000000
2 001004 1997 0.00 0.00 0.000000000
3 001004 1998 0.00 0.00 0.000000000
4 001004 1999 0.00 0.00 0.000000000
5 001004 2000 0.00 0.00 0.000000000
6 001004 2001 0.25 0.25 0.009645437
他们都有1,048,575行。我的代码是merge(a,b,by=c("GVKEY","YEAR"))
,我不断收到错误消息“negative length vectors are not allowed
”。我也尝试了data.table方式,但得到了错误消息,说我的结果会超过2^31行。显然,合并的数据不会那么大,所以我不知道如何解决这个问题。
我不知道如何merge
实现,但似乎有一个很大的区别,当你试图通过一列或两合并,因为你可以在下面的仿真看到:
> df1<-data.frame(a=1:200000,b=2*(1:200000),c=3*(1:200000))
> df2<-data.frame(a=-df1$a,b=-df1$b,d=4*(1:200000))
> ss<-sample(200000,10000)
> df2[ss,1:2]<-df1[ss,1:2]
> system.time(df3<-merge(x=df1,y=df2,by=c('a','b')))
user system elapsed
1.25 0.00 1.25
> system.time(df4<-merge(x=df1,y=df2,by='a'))
user system elapsed
0.06 0.00 0.06
查看系统内存,双列合并也使用了更多的内存。在那里可能有一个笛卡尔产品,我想这是什么导致你的错误。
您可以做的是为每个data.frame创建一个连接GVKEY和YEAR的新列,并按该列进行合并。
a$newKey<-paste(a$GVKEY,a$YEAR,sep='_')
b$newKey<-paste(b$GVKEY,b$YEAR,sep='_')
c<-merge(a,b,by='newKey')
您需要清理结果中的列,因为GVKEY和YEAR都会出现两次,但至少合并应该工作。
我在执行类似于MS Excel中存在的vlookup的任务时遇到了同样的问题。出现此错误是因为您的键列不够好,无法将数据从一个表映射到另一个表。按照@Assaf Wool的说明,更好地移除零或创建一个独特的列。希望它会有所帮助!
由于连接创建的data.frame
/data.table
有多行2^31 - 1
行(2,147,483,647),您会收到此错误。由于矢量是由R内部构建的,因此任何矢量的最大长度为2^31 - 1
个元素(请参见:https://stackoverflow.com/a/5234293/2341679)。由于一个data.frame
/data.table
实际上是一个向量的list()
,这个限制也适用于行数。
正如其他人评论,并回答了,不幸的是,你将无法构造此data.table
,它可能有一些重复的,因为很多行你的你的两个data.tables
(这些可能会或可能不会是故意之间相匹配部分)。
好消息是,如果重复的匹配是不错误,你仍然要执行的加入,在它周围有一个办法:你只需要你想对所得data.table
做任何计算在同一呼叫的连接使用data.table[]
操作,e.g.
:
dt_left[dt_right, on = .(GVKEY, YEAR),
j = .(sum(firm_related_wealth), mean(fracdirafterindep),
by = .EACHI]
如果你不熟悉data.table
语法,如上图所示,使用j
参数可以执行对data.table
中的列计算。使用此语法执行连接时,将在由连接创建的data.table
上执行j
中的计算。
这里的关键是by = .EACHI
参数。这将加入(以及在j
中的后续计算)分解成更小的组分:对于dt_right
中的每一行data.table
及其在dt_left
中的匹配,避免了使用>2^31 - 1
行创建data.table
的问题。
你在这两个数据集中的'by'列有重复吗? – akrun
http://stackoverflow.com/questions/36842263/memory-limits-in-data-table-negative-length-vectors-are-not-allowed这似乎是一个内存问题。 https://stat.ethz.ch/pipermail/r-help/2015-January/425051.html – jogo
尝试'nrow(duplicated(a [,c(“GVKEY”,“YEAR”)])''和'nrow (重复(b [,c(“GVKEY”,“YEAR”)])'来计算重复键的行数 – OdeToMyFiddle