将函数应用于数据框的子集

时间:2014-04-23 14:22:01

标签: r split dataframe bigdata subset

我有一个像这样的巨大数据框

 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的最小值和最大值,但它占用的内存太多而且非常慢。

我该怎么做?

3 个答案:

答案 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]