我正在尝试重新排列我的数据以进行下游处理。我找到了一种方法来完成我想要的事情,但它是内存密集型的,我确信有一种更有效的方法。
以下是数据示例:
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
我可以使用如下所示的 spread
、apply
和 ldply
函数很好地做到这一点:
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/