2014-04-23 85 views
2

的我有这样应用功能子集的数据帧

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的最小值和最大值为列表中的每个元素,但它需要太多的内存,实在是太慢了。

我该怎么办?

回答

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的每次迭代之间强制垃圾收集。

但是,我意识到这不是一个高度优雅的解决方案。 :)

2

你可以做dplyr:

data %>% group_by(V7) %>% summarise(Max=max(V8), Min=min(V8)) 

心连心

2

使用data.table

require(data.table) 
setDT(data)[, list(Max=max(V8), Min=min(V8)), by=V7]