我刚刚尝试在具有 64G 内存的机器上合并 R 3.0.1 中的两个表并得到以下错误。帮助将不胜感激。(data.table 版本为 1.8.8)
这是我的代码的样子:
library(parallel)
library(data.table)
data1:几百万行和 3 列。列是tag
和。有 750K 的唯一值,每个 1 到 1000秒,有 5000 个可能的值。取任何正的实际值。prod
v
tag
prod
tag
prod
v
setkey(data1, tag)
merge (data1, data1, allow.cartesian=TRUE)
我收到以下错误:
vecseq(f_ , len _, if (allow.cartesian) NULL else as.integer(max(nrow(x), : Join 导致超过 2^31 行(内部 vecseq 达到物理限制)中的错误。很可能是错误指定的连接. 检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没关系,请尝试包含
j
和删除by
(by-without-by) 以便 j 为每个组运行以避免大否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。调用:merge -> merge.data.table -> [ -> [.data.table -> vecseq
显示 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 规范)。