【问题标题】:dplyr - summarise_each grouping by factor equality against multiple columnsdplyr - summarise_each 按因子相等对多列进行分组
【发布时间】:2014-10-06 14:06:14
【问题描述】:

我想总结每列的总和,按 A 或 B 分组 gg的

> gg
  A  B a1 a2 a3
1 c2 c1  1  5  9
2 c1 c3  2  6 10
3 c4 c2  3  7 11
4 c3 c2  4  8 12

得到

> test 
   AB a1 a2 a3
1  c1  3 11 19
2  c2  8 20 32
3  c3  6 14 22
4  c4  3  7 11

我知道如何为 A 列执行此操作:

test<-gg %>%
  group_by(A) %>%
  summarise_each(funs(sum(., na.rm=TRUE)),a1:a3)

你能帮我为 A 和 B 做这件事吗?

感谢您的帮助

【问题讨论】:

    标签: r group-by dplyr


    【解决方案1】:

    考虑将数据集的形状更改为更长的格式。例如,您可以将 tidyr 包中的 gather 用于 gather AB 在求和之前合并到一个列中。

    以下是您如何将gather 与您的数据集一起使用,显示更长的输出数据集以及新的AB 列。

    library(tidyr)
    gather(gg, group, AB, A:B)
    
      a1 a2 a3 group AB
    1  1  5  9     A c2
    2  2  6 10     A c1
    3  3  7 11     A c4
    4  4  8 12     A c3
    5  1  5  9     B c1
    6  2  6 10     B c3
    7  3  7 11     B c2
    8  4  8 12     B c2
    

    您可以在分组之前将gather 步骤添加到您的代码链中。然后 group_by 你的新 AB 变量并使用你的其余代码。

    library(dplyr)
    gg %>%
        gather(group, AB, A:B) %>%
        group_by(AB) %>%
        summarise_each(funs(sum(., na.rm = TRUE)), a1:a3)
    
    Source: local data frame [4 x 4]
    
      AB a1 a2 a3
    1 c1  3 11 19
    2 c2  8 20 32
    3 c3  6 14 22
    4 c4  3  7 11
    

    【讨论】:

    • 谢谢!!我不知道从包 tidyr 收集
    【解决方案2】:

    您是否有理由需要使用dplyr

    AB <- unique(dat$A, dat$B)
    data.frame(AB, do.call("rbind", lapply(AB, function(x) {
      colSums(dat[dat$A==x | dat$B==x, c("a1", "a2", "a3")])
    })))
    
    ##   AB a1 a2 a3
    ## 1 c2  8 20 32
    ## 2 c1  3 11 19
    ## 3 c4  3  7 11
    ## 4 c3  6 14 22
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多