【问题标题】:R sum a variable by two groups [duplicate]R按两组对变量求和[重复]
【发布时间】:2019-02-24 01:34:50
【问题描述】:

我在 R 中有一个通常采用这种形式的数据框:

ID     Year     Amount  
3       2000      45  
3       2000      55  
3       2002      10  
3       2002      10  
3       2004      30  
4       2000      25  
4       2002      40  
4       2002      15  
4       2004      45  
4       2004      50

我想按 ID 对每年的金额求和,并使用此输出获得一个新的数据框。

ID      Year     Amount  
3       2000      100  
3       2002       20  
3       2004       30  
4       2000       25  
4       2002       55  
4       2004       95 

这是我需要做的一个例子,实际上数据要大得多。请帮忙,谢谢!

【问题讨论】:

  • aggregate(Amount ~ ID + Year, DF, sum)

标签: r dplyr aggregate


【解决方案1】:

data.table

library("data.table")

D <- fread(
"ID     Year     Amount  
3       2000      45  
3       2000      55  
3       2002      10  
3       2002      10  
3       2004      30  
4       2000      25  
4       2002      40  
4       2002      15  
4       2004      45  
4       2004      50"
)
D[, .(Amount=sum(Amount)), by=.(ID, Year)]

并以R为基数:

aggregate(Amount ~ ID + Year, data=D, FUN=sum)

(由@markus 评论)

【讨论】:

    【解决方案2】:

    您可以group_by IDYear 然后在summarise 中使用sum

    library(dplyr)
    
    txt <- "ID Year Amount
    3 2000 45
    3 2000 55
    3 2002 10
    3 2002 10
    3 2004 30
    4 2000 25
    4 2002 40
    4 2002 15
    4 2004 45
    4 2004 50"
    
    df <- read.table(text = txt, header = TRUE)
    
    df %>% 
      group_by(ID, Year) %>% 
      summarise(Total = sum(Amount, na.rm = TRUE))
    #> # A tibble: 6 x 3
    #> # Groups:   ID [?]
    #>      ID  Year Total
    #>   <int> <int> <int>
    #> 1     3  2000   100
    #> 2     3  2002    20
    #> 3     3  2004    30
    #> 4     4  2000    25
    #> 5     4  2002    55
    #> 6     4  2004    95
    

    如果您有多个Amount 列并且想要应用多个函数,您可以使用summarise_ifsummarise_all

    df %>% 
      group_by(ID, Year) %>% 
      summarise_if(is.numeric, funs(sum, mean))
    #> # A tibble: 6 x 4
    #> # Groups:   ID [?]
    #>      ID  Year   sum  mean
    #>   <int> <int> <int> <dbl>
    #> 1     3  2000   100  50  
    #> 2     3  2002    20  10  
    #> 3     3  2004    30  30  
    #> 4     4  2000    25  25  
    #> 5     4  2002    55  27.5
    #> 6     4  2004    95  47.5
    
    df %>% 
      group_by(ID, Year) %>% 
      summarise_all(funs(sum, mean, max, min))
    #> # A tibble: 6 x 6
    #> # Groups:   ID [?]
    #>      ID  Year   sum  mean   max   min
    #>   <int> <int> <int> <dbl> <dbl> <dbl>
    #> 1     3  2000   100  50      55    45
    #> 2     3  2002    20  10      10    10
    #> 3     3  2004    30  30      30    30
    #> 4     4  2000    25  25      25    25
    #> 5     4  2002    55  27.5    40    15
    #> 6     4  2004    95  47.5    50    45
    

    reprex package (v0.2.1.9000) 于 2018 年 9 月 19 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-17
      • 2017-11-04
      • 2021-02-11
      • 2015-07-19
      相关资源
      最近更新 更多