我有一个旧问题,由于数据集的大小而变得更具挑战性。这个问题是将数据框从长格式转换为宽矩阵:
set.seed(314)
A <- data.frame(field1 = sample(letters, 10, replace=FALSE),
field2 = sample(toupper(letters), 10, replace=FALSE),
value=1:10)
B <- with(A, tapply(value, list(field1, field2), sum))
这也可以使用旧的reshape在基础R中完成,或者更好地在plyr和reshape2中完成。 在plyr中:
daply(A, .(field1, field2), sum)
在reshape2中:
dcast(A, field1 ~ field2, sum)
问题在于我所拥有的数据框具有30+万行,其中至少有5000个唯一值的field1和20000个唯一值的field2。由于这样的大小,plyr会崩溃,reshape2偶尔会崩溃,tapply非常慢。机器不是限制因素(48GB,<50%利用率和8核Xeon)。对于此任务,最佳实践是什么?
注:此问题不是重复的。我明确指出输出应为宽数组。作为重复引用的答案引用了dcast.data.table的使用,它返回一个data.table。将data.table转换为数组是非常昂贵的操作。