如何在df的群组中找到均值和sd?

时间:2019-10-23 08:53:14

标签: r dataframe

我正在努力完成一项任务:我有一个数据框,其中一列始终是数字,而其他列始终是因素。我不知道数字列的索引。 我的任务是:按所有因素对数据框进行分组,然后在每个组内查找均值和标准差。 我已经完成了部分工作:

library(dplyr)
library(stats)
df <-  data.frame(
  col1 = sample(LETTERS[1:3], 100, replace=TRUE),
  col2 = sample(LETTERS[1:3], 100, replace=TRUE),
  col3 = rnorm(100))
df
find_mean_sd <- function(df){
  numeric <- which(sapply(df,is.numeric)==TRUE)
  columns <- names(df)[-numeric]
  dots <- lapply(columns, as.symbol)
  df %>%
    group_by_(.dots=dots) %>%
    summarise(mean = mean(df[,numeric]), SD= sd(df[,numeric]))
}
find_mean_sd(df)

我对均值和标准差感到困惑:为什么所有组都一样?我想得到9种不同的含义。

2 个答案:

答案 0 :(得分:1)

我们可以使用dplyr::*_if选择所需的列

library(dplyr)
df %>% 
   group_by_if(is.factor) %>% 
   summarise_if(is.numeric, list(mean=~mean(., na.rm = TRUE), SD=~sd(.,na.rm = TRUE)))

答案 1 :(得分:1)

如果要修复代码,可以尝试以下操作:

 library(dplyr)
 find_mean_sd <- function(df){
    numeric <- which(sapply(df,is.numeric)==TRUE)
    columns <- names(df)[-numeric]
    dots <- lapply(columns, as.symbol)
    df %>%
      group_by_(.dots=dots) %>%
      summarise_all(funs(mean,sd))  # here you can summarise by the functions you need
  }

  find_mean_sd(df)
# A tibble: 9 x 4
# Groups:   col1 [3]
  col1  col2     mean    SD
  <fct> <fct>   <dbl> <dbl>
1 A     A      0.202  1.19 
2 A     B     -0.141  0.950
3 A     C      0.585  0.596
4 B     A     -0.0812 1.20 
5 B     B     -0.380  1.18 
6 B     C      0.300  0.846
7 C     A     -0.152  0.705
8 C     B      0.136  1.39 
9 C     C      0.263  0.762

我认为问题是您在dplyr链中使用了df,尽管有A. Suliman解决方案,但对于您的目的,summarise部分却没有必要更优雅。