首页 > 解决方案 > dplyr 中的分组方式

问题描述

我从已发表的论文中找到了以下代码。在这种特定情况下,我会说该策略效果很好,因为它很清楚并且变量相对较少。但是,代码“有点”重复,我想知道是否有一种不那么重复的方式来做到这一点,这仍然符合dplyr风格和生活方式。

在此处输入图像描述

一个测试用例:

set.seed(42)
df <- data.frame(GR=sample(1:2, 100, replace=TRUE),
       as.data.frame(replicate(20, rnorm(100))))
names(df)[-1] <- LETTERS[1:20]

现在分组表使用aggregate

aggregate(df[,-1], df[1],mean)

...并与dplyr

df %>% group_by(GR) %>% summarize(mean.A=mean(A),
                                  mean.B=mean(B),
                                  mean.C=mean(C),
                                  mean.D=mean(D),
                                  mean.E=mean(E),
                                  # skipped 14 rows
                                  mean.T=mean(T))

有没有一种干燥的方式来做到这一点dplyr?我知道 R 中的所有编程工具也都可用dplyr- 所以问题不在于如何做到这一点......相反,我正在寻找一种惯用的dplyr方式来做到这一点。我在现实生活中见过类似但更长的例子。

标签: rdplyraggregate

解决方案


当有多个列时summarise,使用其中一个summarise_all(如果所有其他列都需要使用除分组变量之外的函数进行汇总)

df %>%
   group_by(GR) %>%
   summarise_all(funs(mean = mean(., na.rm = TRUE)))

如果我们只需要在选定的列上执行此操作,请尝试使用summarise_at

df %>%
   group_by(GR) %>%
   summarise_at(vars(A, B, C, D, E), funs(mean = mean(., na.rm = TRUE)))

另外,检查summarise_if我们何时只想在某些type列上应用该函数


推荐阅读