我只是尝试在具有64G ram的计算机上合并R 3.0.1中的两个表,并出现以下错误。帮助将不胜感激。 (data.table版本是1.8.8)
以下是我的代码:
library(parallel)
library(data.table)
data1:数百万行和3列。列为tag
,prod
和v
。 tag
有750K唯一值,每prod
个{1}} tag
,prod
可能有5000个值。 v
具有任何积极的实际价值。
setkey(data1, tag)
merge (data1, data1, allow.cartesian=TRUE)
我收到以下错误:
vecseq中的错误(f_ ,len _,if(allow.cartesian)NULL else as.integer(max(nrow(x),: 加入超过2 ^ 31行的结果(内部vecseq达到物理限制)。很可能是错误的加入。检查i中的重复键值,每个键值一遍又一遍地连接到x中的同一组。如果没关系,请尝试包括
j
并删除by
(by-without-by),以便为每个组运行j以避免大量分配。否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议。 电话:合并 - > merge.data.table - > [ - > [.data.table - > vecseq
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规范。)
答案 0 :(得分:2)
R 3.0.1 支持长度大于2 ^ 31 - 1的对象。虽然基础R附带的软件包已经可以创建这样的对象,但是贡献的软件包是否可以做同样的事情取决于包。基本上,任何使用编译代码的包都必须重新编译并可能被修改以利用此功能。
另外,假设64GB RAM足以与60GB对象一起使用,这是一种乐观的态度。
答案 1 :(得分:2)
这种联合确实似乎是错误的。一般来说,我认为,一个表与单列键的自连接可能总是错误指定。请考虑以下示例:
> DT
A B
1: 1 5
2: 1 6
3: 1 7
4: 2 8
5: 2 9
> setkey(DT,A)
A(1和2)有2个唯一值,但它们在A列中重复出现。关键是一列。
> DT[DT] # the long error message
> DT[DT, allow.cartesian=TRUE] # **each row** of DT is self joined to DT
A B B.1
1: 1 5 5
2: 1 6 5
3: 1 7 5
4: 1 5 6
5: 1 6 6
6: 1 7 6
7: 1 5 7
8: 1 6 7
9: 1 7 7
10: 2 8 8
11: 2 9 8
12: 2 8 9
13: 2 9 9
这真的是你需要的结果吗?更有可能的是,需要通过向密钥添加更多列来更改查询,而不是执行by
,不执行自联接或错误消息中的提示。
有关合并后需要实现的更多信息(更大的图片)可能会有所帮助。
现在有问题的例子(协方差)通常用矩阵而不是data.table完成。但无论如何要继续快速演示,只需将其用作示例数据......
require(data.table)
country = fread("
Country Product
1 5
1 6
1 7
2 6
2 7
2 8
2 9
")
prod = fread("
Prod1 Prod2 Covariance
5 5 .4
5 6 .5
5 7 .6
5 8 -.3
5 9 -.1
6 6 .3
6 7 .2
6 8 .4
6 9 -.2
7 7 .2
7 8 .1
7 9 .3
8 8 .1
8 9 .6
9 9 .01
")
country
Country Product
1: 1 5
2: 1 6
3: 1 7
4: 2 6
5: 2 7
6: 2 8
7: 2 9
prod
Prod1 Prod2 Covariance
1: 5 5 0.40
2: 5 6 0.50
3: 5 7 0.60
4: 5 8 -0.30
5: 5 9 -0.10
6: 6 6 0.30
7: 6 7 0.20
8: 6 8 0.40
9: 6 9 -0.20
10: 7 7 0.20
11: 7 8 0.10
12: 7 9 0.30
13: 8 8 0.10
14: 8 9 0.60
15: 9 9 0.01
setkey(country,Country)
country[country,{print(.SD);print(i.Product)}]
# included j to demonstrate j running for each row of i. Just printing to demo.
Product
1: 5
2: 6
3: 7
[1] 5
Product
1: 5
2: 6
3: 7
[1] 6
Product
1: 5
2: 6
3: 7
[1] 7
Product
1: 6
2: 7
3: 8
4: 9
[1] 6
Product
1: 6
2: 7
3: 8
4: 9
[1] 7
Product
1: 6
2: 7
3: 8
4: 9
[1] 8
Product
1: 6
2: 7
3: 8
4: 9
[1] 9
Empty data.table (0 rows) of 2 cols: Country,Product
setkey(prod,Prod1,Prod2)
country[country,prod[J(i.Product,Product),Covariance,nomatch=0]]
Country Prod1 Prod2 Covariance
1: 1 5 5 0.40
2: 1 5 6 0.50
3: 1 5 7 0.60
4: 1 6 6 0.30
5: 1 6 7 0.20
6: 1 7 7 0.20
7: 2 6 6 0.30
8: 2 6 7 0.20
9: 2 6 8 0.40
10: 2 6 9 -0.20
11: 2 7 7 0.20
12: 2 7 8 0.10
13: 2 7 9 0.30
14: 2 8 8 0.10
15: 2 8 9 0.60
16: 2 9 9 0.01
country[country, prod[J(i.Product,Product),Covariance,nomatch=0][
,mean(Covariance),by=Country]
Country V1
1: 1 0.3666667
2: 2 0.2010000
由于关闭对角线不加倍,这与期望的结果不匹配。但希望这足以证明问题中的错误消息中的特定建议,您可以从这里开始。或者使用matrix
而非data.table
进行协方差类型工作。