首页 > 解决方案 > 分组后获取多列的方法

问题描述

使用下面的代码,我试图按“性别和 CG_less14”对我的数据(Diss)进行分组,然后获得第 5 到 29 列的平均值。然后我想将平均值四舍五入到最接近的小数。我想在控制台中打印这些方法,以便手动使用它们进行进一步分析。

我收到一个错误:t(., round(colMeans(Diss[, 5:29]), 2)) 中的错误:未使用的参数 (round(colMeans(Diss[, 5:29]), 2))

 Diss %>%
   group_by(gender, CG_less14) %>%
         t(round(colMeans(Diss[,5:29]),2))

标签: rdplyr

解决方案


dplyr,我们可以使用summarise_at

library(dplyr)
Diss %>%
    group_by(gender, CG_less14) %>%
    summarise_at(5:29, ~ round(mean(.), 2))

base R,我们可以使用aggregate

aggregate(.~ gender + CG_less14, Diss, function(x) round(mean(x), 2))

一个可重现的例子iris

iris %>%
     group_by(Species) %>% 
     summarise_at(1:2, ~ round(mean(.), 2))
# A tibble: 3 x 3
#  Species    Sepal.Length Sepal.Width
#  <fct>             <dbl>       <dbl>
#1 setosa             5.01        3.43
#2 versicolor         5.94        2.77
#3 virginica          6.59        2.97

请注意,在我们执行 之后group_by,可以使用.data或访问数据.,如果我们使用原始数据对象进行子集化,则会破坏分组过程,而是获取整列

如果我们想使用colMeans,一个选项是split通过分组变量对数据使用group_split,遍历感兴趣listselect列并应用colMeans

library(purrr)
iris %>%
   group_split(Species, keep = FALSE) %>%
   map_dfr(~ .x %>% 
                select(1:2) %>%
                colMeans %>% 
                round(2))

推荐阅读