r - 什么是分散然后聚集列的内存有效方法? (参见示例)

标签 r reshape memory-efficient

我正在尝试重新排列我的数据以进行下游处理。我找到了一种方法来完成我想要的事情,但它是内存密集型的,我确信有一种更有效的方法。

以下是数据示例:

   X.1 Label       X
81  81    21 367.138
82  82    21 384.295
83  83    21 159.496
84  84    21 269.927
85  85    22 364.118
86  86    22 154.475
87  87    22 265.861

我想重新排列数据,为每个单独的对象创建一个 X 值表,如下所示:

    1       2       3       4
1 367.138 384.295 159.496 269.927
2 364.118 154.475 265.861      NA

我可以使用如下所示的 spreadapplyldply 函数很好地做到这一点:

X <- apply(tidyr::spread(X, Label,X), 2, function(x) na.omit(x))
X<-X[-1]
X<-plyr::ldply(X, rbind)
X<-as.data.frame(X[-1])

问题在于,spread 函数生成下表作为中间步骤:

  X.1       1       2
1  81 367.138      NA
2  82 384.295      NA
3  83 159.496      NA
4  84 269.927      NA
5  85      NA 364.118
6  86      NA 154.475
7  87      NA 265.861

这对于小数据集来说很好,但是对于大数据集,生成的表很大,并且我的内存不足,从而产生以下错误:

Error: cannot allocate vector of size 8.4 Gb

我确信必须有一种更有效的方法来执行此操作,而无需生成庞大的中间表。有任何想法吗?

最佳答案

使用data.table的选项

dcast(DT, rleid(Label) ~ rowid(Label), value.var = "X")
#   Label       1       2       3       4
#1:     1 367.138 384.295 159.496 269.927
#2:     2 364.118 154.475 265.861      NA

数据

library(data.table)
DT <- fread(text = "   X.1 Label       X
  81    21 367.138
  82    21 384.295
  83    21 159.496
  84    21 269.927
  85    22 364.118
  86    22 154.475
  87    22 265.861")

关于r - 什么是分散然后聚集列的内存有效方法? (参见示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384427/

相关文章:

R Shiny : Output warning messages to UI

python - 在 R 中使用自定义分词器将文本转换为向量?

python - pandas根据变量值添加变量

r - 通过按子组比较来限制模糊字符串比较的数量

Rcpp 子集 DataFrame 的行

r - data.table 中有没有办法根据标识符按组分配 ID?

在 R : rows to columns 中 reshape 数据框

python - PyTorch:在张量的单维上应用映射

javascript - 每秒扫描页面查找关键字是否有效?

java - 在 Java 中声明 double - 本地一次或从 ArrayList<Double> 重复声明?