合并错误:不允许使用负长度向量

时间:2017-02-27 07:18:20

标签: r merge

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

3 个答案:

答案 0 :(得分:7)

您收到此错误的原因是该联接创建的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

如果您不熟悉data.table语法,则可以使用j参数对j中的列进行计算,如上所示。使用此语法执行连接时,data.table中的计算将在连接创建的by = .EACHI上执行。

这里的关键是j参数。这会将联接(以及data.table中的后续计算)分解为更小的组件:dt_right中的每一行dt_left及其data.table中的匹配,从而避免创建问题a 2^31 - 1> url行。

答案 1 :(得分:0)

我在执行r中的任务时遇到了同样的问题,类似于MS Excel中的vlookup。此错误是因为您的键列不足以将数据从一个表映射到另一个表。如@Assaf Wool所述,最好删除零或使列独特。希望它会有所帮助!

答案 2 :(得分:-1)

我不确定 - name: install jruby shell: . /etc/profile.d/rbenv.sh && rbenv install jruby-9.0.5.0 become: yes args: executable: /bin/bash -l 是如何实现的,但是当你尝试合并一列或两列时,似乎会有很大的不同,正如您在下面的模拟中所看到的那样:

merge

查看系统内存,两列合并也使用了更多内存。那里可能有一个笛卡尔产品,我想这就是造成你错误的原因。

您可以做的是为每个data.frame创建一个连接GVKEY和YEAR的新列,并按该列进行合并。

> 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 

您需要清理结果中的列,因为GVKEY和YEAR都会出现两次,但至少合并应该有效。