我正在努力完成一项任务:我有一个数据框,其中一列始终是数字,而其他列始终是因素。我不知道数字列的索引。 我的任务是:按所有因素对数据框进行分组,然后在每个组内查找均值和标准差。 我已经完成了部分工作:
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种不同的含义。
答案 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
部分却没有必要更优雅。