【问题标题】:Aggregating multiple columns by group [duplicate]按组聚合多个列[重复]
【发布时间】:2020-08-23 00:58:41
【问题描述】:

我有一个数据表如下:

library(data.table)
dt <- fread(
    "A   B   D  E  iso   year   
     1   A   1  NA ECU   2009   
     2   B   2  0  ECU   2009   
     3   D   3  0  BRA   2011   
     4   E   4  0  BRA   2011   
     5   D   7  NA ECU   2008   
     6   E   1  0  ECU   2008   
     7   A   3  2  BRA   2012   
     8   A   4  NA BRA   2012",
  header = TRUE
)

我想通过执行以下操作来创建数据集的聚合:dt[, .(D = sum(D)), by = c("iso", "year")]

但是,我希望能够添加AE(以及实际数据中的另外 10 列),而不是仅用于 D

期望的输出:

dt <- fread(
    "A   D  E  iso   year   
     3   3  0  ECU   2009   
     7   7  0  BRA   2011    
    11   8  0  ECU   2008    
    15   7  2  BRA   2012",
  header = TRUE
)

如何指定?

【问题讨论】:

    标签: r sum data.table aggregate


    【解决方案1】:

    您可以将.SD + .SDcols 组合起来,然后循环.SDlapply()

    dt[, 
       lapply(.SD, sum, na.rm = TRUE), 
       by = c("iso", "year"), 
       .SDcols = c("A", "D", "E")]
    
       iso year  A D E
    1: ECU 2009  3 3 0
    2: BRA 2011  7 7 0
    3: ECU 2008 11 8 0
    4: BRA 2012 15 7 2
    

    【讨论】:

    • 这很有魅力,非常感谢!
    【解决方案2】:

    使用 dplyr 包

    您也可以使用dplyr 包,在这种情况下您不需要指定所有列名:

    library(dplyr)
    dt$E[is.na(dt$E)] <- 0
    dt %>%
      group_by(iso, year) %>%
      summarize_at(vars(A, D:E), .funs = sum)
    

    输出:

    # A tibble: 4 x 5
    # Groups:   iso [2]
      iso    year     A     D     E
      <chr> <int> <int> <int> <dbl>
    1 BRA    2011     7     7     0
    2 BRA    2012    15     7     2
    3 ECU    2008    11     8     0
    4 ECU    2009     3     3     0
    

    希望这会有所帮助。

    【讨论】:

    • OP 说他正在处理 13 列,有没有更简洁的方式使用 dplyr,也许与其他 tidyverse 包结合使用?
    • @sindri_baldur 更改为 summarize_at
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2016-03-20
    • 1970-01-01
    • 2021-01-30
    • 2014-05-29
    相关资源
    最近更新 更多