我有一个像这样的巨大数据框
head(newdata)
V1 V2 V3 V4 V5 V6 V7 V8
1 a 1941 2 14 -73.90 38.60 US009239 4
2 b 1941 2 14 -74.00 36.90 US009239 6
3 c 1941 2 14 -74.00 35.40 US009239 4
5 d 1941 2 15 -74.00 32.60 US009239 7
6 f 1941 2 15 -73.80 31.70 US009239v 1
我想做的是对由相同V7表征的每个数据子集执行一些操作。我尝试用
拆分它split(data, list(data$V7), drop = TRUE)
然后计算列表中每个元素的V8的最小值和最大值,但它占用的内存太多而且非常慢。
我该怎么做?
答案 0 :(得分:2)
以下方案可能会有所帮助
indices <- 1:nrow(newdata)
groups <- split(indices, newdata$V7)
lapply(groups, function(idx) {
subdata <- data[idx,]
# some operations on subdata...
})
它可以防止R同时创建多个子data.frames
,从而可以减少内存使用量。您也可以尝试调用gc(TRUE)
以在lapply
的每次迭代之间强制进行垃圾收集。
但是,我意识到这不是一个非常优雅的解决方案。 :)
答案 1 :(得分:2)
使用dplyr你可以做到:
data %>% group_by(V7) %>% summarise(Max=max(V8), Min=min(V8))
HTH
答案 2 :(得分:2)
使用data.table
:
require(data.table)
setDT(data)[, list(Max=max(V8), Min=min(V8)), by=V7]