【问题标题】:Apply function to subset of data frame [duplicate]将函数应用于数据框的子集[重复]
【发布时间】:2014-06-08 11:03:08
【问题描述】:

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

 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的最小值和最大值,但是它占用了太多的内存并且真的很慢。

我该怎么做?

【问题讨论】:

    标签: r split dataframe bigdata subset


    【解决方案1】:

    以下方案可能会有所帮助

    indices <- 1:nrow(newdata)
    groups <- split(indices, newdata$V7)
    lapply(groups, function(idx) {
       subdata <- data[idx,]
       # some operations on subdata...
    })
    

    它可以防止 R 一次创建多个 sub-data.frames,从而可以减少内存使用量。您也可以尝试调用gc(TRUE) 来强制在lapply 的每次迭代之间进行垃圾回收。

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

    【讨论】:

      【解决方案2】:

      使用data.table

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

      【讨论】:

        【解决方案3】:

        使用 dplyr 你可以做到:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-19
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 2020-04-02
          • 2014-01-08
          • 2020-02-17
          • 1970-01-01
          相关资源
          最近更新 更多