【问题标题】:how to summarise a numeric variable by two factors in R如何通过 R 中的两个因素总结数值变量
【发布时间】:2014-03-07 15:34:50
【问题描述】:

我有一个包含 3 个变量和 1.425.558 个观察值的 data.frame。它是可再生能源工厂安装电力的登记册。每行代表一个已安装的发电厂。一个邮政编码区域可以有多个相同类型的发电厂。

ID  zipcode     Type    power
1   79280   solarpower  3
2   79280   solarpower  3
3   79283   hydroelectric   3
4   79280   biogas          55
5   79280   windpower   2
6   21459   windpower   4
7   21459   windpower   2

我想按邮政编码总结安装了多少太阳能/沼气/风力发电。

zipcode     Type    power
21459        windpower    6
79280        solarpower   6
79280        windpower    2
...and so on.

我已经试过了

aggregate(myDat$power, by=list(myDat$zipcode,myDat$type), FUN=sum)

但我的 RAM 不够用。

我知道,我的数据框非常大。我可以缩小很多范围,因为我只需要那些以“2”开头的邮政编码的数据。

你能给我指出一个解决方案吗? 非常感谢您帮助初学者!

【问题讨论】:

    标签: r sum aggregate data.table dplyr


    【解决方案1】:

    如果我理解正确你需要什么,你可以用 dplyr 来表达:

    > data %.% group_by( zipcode, Type ) %.% summarise( power = sum(power) )
    Source: local data frame [5 x 3]
    Groups: zipcode
    
      zipcode          Type power
    1   21459     windpower     6
    2   79280     windpower     2
    3   79280        biogas    55
    4   79283 hydroelectric     3
    5   79280    solarpower     6
    

    如果你只想要那些以2 开头的邮政编码,你可以先filter

    > data %.% filter( grepl( "^2", zipcode ) ) %.% 
         group_by( zipcode, Type ) %.% summarise( power = sum(power) )
    Source: local data frame [1 x 3]
    Groups: zipcode
    
      zipcode      Type power
    1   21459 windpower     6
    

    【讨论】:

      【解决方案2】:

      data.table版本:

      library(data.table)
      dt = data.table(your_df)
      
      dt[, sum(power), by = list(zipcode, Type)]
      

      首先缩小范围:

      dt[grep("^2", zipcode), sum(power), by = list(zipcode, Type)]
      

      因为grep 的成本很高,所以在dplyrdata.table 中,您最好(速度方面)首先总结,然后过滤,即:

      dt[, sum(power), by = list(zipcode, Type)][grep("^2", zipcode)]
      

      【讨论】:

      • perl=TRUE 使用grep 参数有助于加快速度。
      • 另外,如果您知道邮政编码始终是 5 位,您可以这样做:zipcode %/% 10000 == 2(不转换为字符也可以节省更多时间)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2019-10-07
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2021-01-04
      • 2019-01-30
      相关资源
      最近更新 更多