【问题标题】:Aggregate and calculate in one step in r在r中一步聚合和计算
【发布时间】:2014-12-20 13:49:25
【问题描述】:

我正在尝试在 R 中使用聚合来汇总一些数据,同时还使用以下数据计算附加列的值

新数据

Year    HNo County  ST  Month   Day DuckBag GooseBag
2012    264120547   LA  ND  10  13  6   0
2008    264080047   EDDY    ND  9   27  4   1
2013    26430119    ROLETTE ND  10  20  3   0
2006    264060447   BURKE   ND  10  25  5   0
2006    264061113   BENSON  ND  10  2   3   1
2012    564120139   OLIVER  ND  12  15  0   3
2013    26430294    TOWNER  ND  10  10  2   0
2007    564070298   LOGAN   ND  9   29  0   0
2007    564070869   SHERIDAN    ND  10  21  0   0
2007    564070315   CASS    ND  9   2   0   0
2005    264050791   SHERIDAN    ND  10  15  3   0
2012    264120240   RAMSEY  ND  11  1   6   0
2013    26431021    TOWNER  ND  10  20  3   0
2013    56430774    NA  ND  10  9   5   2
2006    264061288   BENSON  ND  10  4   5   1
2005    264051006   EDDY    ND  10  17  5   2
2010    264100848   MORTON  ND  10  2   0   0
2011    264110151   CASS    ND  10  8   4   1
2005    264051100   WARD    ND  10  9   1   0
2013    26430194    MC  ND  11  1   5   0

我想在 Year 和 Month 上汇总每个组合的 DuckBag 和 GooseBag 的总和。此外,我想计算每个年/月组合中有多少行的 DuckBag 或 GooseBag >0。

我可以接近这些代码,但不是我想要的。

aggregate(newdata$DuckBag,list(Year = newdata$Year, Month = newdata$Month),sum)
aggregate(DuckBag ~ Year+Month,data = newdata,FUN=function(newdata) c(total =sum(newdata), n=length(newdata) ) )

dplyr 会更好地工作吗?我看过的 dplyr 代码看起来更干净,但不知道从哪里开始计数。最后,虽然我确定它要求太多,但有没有办法可以添加一个列,让我给出由该年/月总和表示的适当年份总和的比例?非常感谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    也许像这样?

    group_by(df, Year, Month) %>%
      summarise_each(funs(Sum = sum(.), Positive = sum(. > 0)), DuckBag, GooseBag)
    #Source: local data frame [12 x 6]
    #Groups: Year
    #
    #   Year Month DuckBag_Sum GooseBag_Sum DuckBag_Positive GooseBag_Positive
    #1  2005    10           9            2                3                 1
    #2  2006    10          13            2                3                 2
    #3  2007     9           0            0                0                 0
    #4  2007    10           0            0                0                 0
    #5  2008     9           4            1                1                 1
    #6  2010    10           0            0                0                 0
    #7  2011    10           4            1                1                 1
    #8  2012    10           6            0                1                 0
    #9  2012    11           6            0                1                 0
    #10 2012    12           0            3                0                 1
    #11 2013    10          13            2                4                 1
    #12 2013    11           5            0                1                 0
    

    【讨论】:

    • 不错。感谢summarise_each的创造力!
    • 我同意,简短、甜美且易于理解。非常感谢!
    【解决方案2】:

    您也可以在aggregate 中一步完成此操作。

    f1 <- function(x) c(Sum=sum(x), Positive=sum(x > 0)) #(just to make it clean)
    res <- do.call(data.frame,aggregate(cbind(DuckBag,GooseBag)~Year+
                                Month, df, FUN=f1))
    res
    #   Year Month DuckBag.Sum DuckBag.Positive GooseBag.Sum GooseBag.Positive
    #1  2007     9           0                0            0                 0
    #2  2008     9           4                1            1                 1
    #3  2005    10           9                3            2                 1
    #4  2006    10          13                3            2                 2
    #5  2007    10           0                0            0                 0
    #6  2010    10           0                0            0                 0
    #7  2011    10           4                1            1                 1
    #8  2012    10           6                1            0                 0
    #9  2013    10          13                4            2                 1
    #10 2012    11           6                1            0                 0
    #11 2013    11           5                1            0                 0
    #12 2012    12           0                0            3                 1
    

    【讨论】:

      【解决方案3】:

      这是我的看法:

      library(dplyr)
      results <- df %>%
                    group_by(Year, Month) %>%
                    summarise(Duck.Bag.Total  = sum(DuckBag),
                              Goose.Bag.Total = sum(GooseBag),
                              Total.Sum       = sum(Duck.Bag.Total, Goose.Bag.Total)) %>%
                    mutate(Duck.or.Goose.Positive = Duck.Bag.Total > 0 | Goose.Bag.Total > 0)
      
      results
      #    Year Month Duck.Bag.Total Goose.Bag.Total Total.Sum Duck.or.Goose.Positive
      # 1  2005    10              9               2        11                   TRUE
      # 2  2006    10             13               2        15                   TRUE
      # 3  2007     9              0               0         0                  FALSE
      # 4  2007    10              0               0         0                  FALSE
      # 5  2008     9              4               1         5                   TRUE
      # 6  2010    10              0               0         0                  FALSE
      # 7  2011    10              4               1         5                   TRUE
      # 8  2012    10              6               0         6                   TRUE
      # 9  2012    11              6               0         6                   TRUE
      # 10 2012    12              0               3         3                   TRUE
      # 11 2013    10             13               2        15                   TRUE
      # 12 2013    11              5               0         5                   TRUE
      

      第二部分:

      results2 <- results %>%
                    group_by(Year) %>%
                    summarise(Total.for.Year = sum(Total.Sum)) %>%
                    mutate(prop = Total.for.Year / sum(Total.for.Year))
      
      results2
      #   Year Total.for.Year       prop
      # 1 2005             11 0.15492958
      # 2 2006             15 0.21126761
      # 3 2007              0 0.00000000
      # 4 2008              5 0.07042254
      # 5 2010              0 0.00000000
      # 6 2011              5 0.07042254
      # 7 2012             15 0.21126761
      # 8 2013             20 0.28169014
      

      【讨论】:

      • 这组答案也很有帮助。特别是关于分步代码和超越以解决第二个问题。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多