在dplyr中分组意味着

时间:2018-05-25 13:46:51

标签: r dplyr aggregate

我从已发表的论文中找到了以下代码。在这个特定的情况下,我会说这个策略运作良好,因为它很清楚,并且变量相对较少。然而,代码是“有点”重复的,我想知道是否有一个重复性较低的方法,它仍然符合(-?[0-9]+)风格和生活方式。

enter image description here

测试用例:

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)) 是否有DRY方式执行此操作?我知道R中的所有编程工具也可以在dplyr中使用 - 所以问题不在于如何做到这一点......相反,我正在寻找一种惯用的dplyr方法。我在现实生活中看到了类似但更长的例子。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

这个怎么样:

df %>% 
  group_by(GR) %>% 
  summarise_all(.funs = mean) %>% 
  setNames(paste("mean", colnames(.), sep = "."))