合并错误:负长度的矢量不准

合并错误:负长度的矢量不准

问题描述:

我试图合并两个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行。显然,合并的数据不会那么大,所以我不知道如何解决这个问题。

+1

你在这两个数据集中的'by'列有重复吗? – akrun

+0

http://*.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

+0

尝试'nrow(duplicated(a [,c(“GVKEY”,“YEAR”)])''和'nrow (重复(b [,c(“GVKEY”,“YEAR”)])'来计算重复键的行数 – OdeToMyFiddle

我不知道如何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://*.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的问题。