【问题标题】:Effiicient transformation of data.table in RR中data.table的高效转换
【发布时间】:2016-01-12 03:55:12
【问题描述】:

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我可以建议的替代方案是:

    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 的方法,通过 sqldfRPresto、等)。

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2020-03-28
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多