我正在使用R中的fread包来读取一个包含6亿行和2列的非常大的数据集。数据被正确读取,但是当我在表上执行转置操作时,出现内存错误。转置数据集将有大约400万行和20,000列。
代码:
library(data.table)
#read in data
data = fread("C:/Users/User12/Desktop/train.tsv")
t1 = table(data$Y,data$X)
当我运行上面的代码时,我收到内存错误。有没有一种智能方法可以在这个大型数据集上创建频率表?
原始表格示例:
data <-
setDT(read.table(text="X Y
4 5
4 6
4 7
5 5
5 6
5 9", header = T))
我想要的输出:
> data[,table(Y,X)]
X
Y 4 5
5 1 1
6 1 1
7 1 0
9 0 1
答案 0 :(得分:3)
我可以建议的替代方案是:
dcast(data[ , .N, by = .(X, Y)], X ~ Y, value.var = "N")
但是,对于类似的样本集(警告:计算密集型),这也失败了:
set.seed(1203)
data <- data.table(X = sample(4e6, 6e8, T), Y = sample(2e4, 6e8, T))
tt <- dcast(data[ , .N, by = .(X, Y)], X ~ Y, value.var = "N")
错误:无法分配大小为298.0 Gb的矢量
所以你可能在R内做这件事(也许是寻求SQL解决方案?)
我认为以下可能是一个可行的选择:
setkeyv(data, c("Y", "X"))
lapply(data[ , unique(Y)], function(y) data[.(y), table(X)])
基本上,我们将问题更改为创建一堆单向表。只要能够正确分配,我们就应该rbind
将它放入您所追求的双向表中。
除此之外,你需要考虑非基于RAM的替代方案(Spark是个人最喜欢的,参见例如SparkR
或sparklyr
,或者通过基于SQL的方法{{3} },sqldf
等。)