R中data.table的有效转换

时间:2016-01-12 03:55:12

标签: r data.table

我正在使用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

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是个人最喜欢的,参见例如SparkRsparklyr,或者通过基于SQL的方法{{3} },sqldf等。)