我尝试合并两个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行。显然,合并的数据不会那么大,所以我不知道如何解决这个问题。
答案 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都会出现两次,但至少合并应该有效。