我只是尝试在具有 64G ram 的机器上合并 R 3.0.1 中的两个表并得到以下错误。帮助将不胜感激。 (data.table 版本是 1.8.8)

这是我的代码的样子:

library(parallel)
library(data.table)

data1:几百万行和 3 列。列是 tagprodvtag 有 750K 个唯一值,每个 prod 有 1 到 1000 个 tagprod 有 5000 个可能值。 v 取任何正实数值。
setkey(data1, tag)
merge (data1, data1, allow.cartesian=TRUE)

我收到以下错误:



显示by-without-by的新示例
country = fread("
country product share
1 5 .2
1 6 .2
1 7 .6
2 6 .3
2 7 .1
2 8 .4
2 9 .2
")
prod = fread("
prod period value
5 1990 2
5 1991 3
5 1992 2
5 1993 4
5 1994 3
5 1995 5
6 1990 1
6 1991 1
6 1992 0
6 1993 4
6 1994 8
6 1995 2
7 1990 3
7 1991 3
7 1992 3
7 1993 4
7 1994 7
7 1995 1
8 1990 2
8 1991 4
8 1992 2
8 1993 4
8 1994 2
8 1995 6
9 1990 1
9 1991 2
9 1992 4
9 1993 4
9 1994 5
9 1995 6
")

选择共享国家/地区标签的市场子集,找到这些对中的协方差,并按国家/地区整理这些市场,而不会遇到大小限制,这似乎是完全不可能的。
这是我迄今为止最好的镜头:
setkey(country,country)
setkey(prod, prod, period)
covars <- setkey(setkey(unique(country[country, allow.cartesian=T][, c("prod","prod.1"), with=F]),prod)[prod, allow.cartesian=T], prod.1, period)[prod, ] [ , list(pcov = cov(value,value.1)), by=list(prod,prod.1)] # really long oneliner that finds unique market pairs from the the self-join, merges it with the second table and calculates covariances from the merged table.
clevel <-setkey(country[country, allow.cartesian = T], prod, prod.1)[covars, nomatch=0][ , list(countryvar = sum(share*share.1*pcov)), by="country"]
> clevel
   country countryvar
1:       1   2.858667
2:       2   1.869667

当我针对任何合理大小的数据尝试这种方法时,我遇到了 vecseq 错误。如果 data.table 没有在 2^31 限制下如此犹豫,那将是非常好的。我是这个包的粉丝。关于如何使用更多 j 规范的建议也将不胜感激。 (鉴于我必须如何计算两个数据表的交集的方差,我不确定如何尝试 J 规范)。

最佳答案

R 3.0.1 支持长度大于 2^31 - 1 的对象。虽然 R 自带的包已经可以创建这样的对象,但贡献的包是否可以做同样的事情取决于包。基本上,任何使用编译代码的包都必须重新编译并可能进行修改以利用此功能。

此外,假设 64GB RAM 足以处理 60GB 对象是一种乐观。

关于r - 加入超过 2^31 行的结果(内部 vecseq 达到物理限制),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18102042/

10-15 02:34