【问题标题】:Merge error : negative length vectors are not allowed合并错误:不允许负长度向量
【发布时间】:2017-07-17 17:14:23
【问题描述】:

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

【问题讨论】:

标签: r merge


【解决方案1】:

您收到此错误是因为连接创建的 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[] 运算符e.g.:

dt_left[dt_right, on = .(GVKEY, YEAR), 
        j = .(sum(firm_related_wealth), mean(fracdirafterindep),
        by = .EACHI]

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

这里的关键是by = .EACHI 参数。这将连接(以及j 中的后续计算)分解为更小的组件:dt_right 中的每一行一个 data.table 及其在dt_left 中的匹配项,避免了使用 > @987654346 创建data.table 的问题@行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不确定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 都会出现两次,但至少合并应该有效。

      【讨论】:

        猜你喜欢
        • 2018-02-08
        • 2019-10-14
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2022-07-19
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多