按因素对多列进行多项统计
Multiple statistics of multiple columns by factor(s)
假设我想计算 "dat_1" 到 [=36= 列的平均值、标准差和 n(非 NA 值的数量) ] 以下数据框,按因素 "fac_1" 和 "fac_2" 分组,以便可以从结果
访问每个统计信息(或函数)的单独数据框
set.seed(1)
df <- data.frame("fac_1" = c(rep("a", 5), rep("b", 4)),
"fac_2" = c("x", "x", "y","y", "y", "y", "x", "x", "x"),
"dat_1" = c(floor(runif(3, 0, 10)), NA, floor(runif(5, 0, 10))),
"dat_2" = floor(runif(9, 10, 20)),
"dat_3" = floor(runif(9, 20, 30)))
这可以使用plyr
一次实现一个功能,因此
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { colMeans(x[, 3:5], na.rm = T) } ) # mean
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { psych::SD(x[, 3:5], na.rm = T) } ) # standrd deviation -- note uses SD from the 'psych' package
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { colSums(!is.na(x[, 3:5])) } ) # number of non-NA values
但这在使用多个函数时变得很麻烦,尤其是当必须更改感兴趣的因子和列时。我想知道是否有其他选择(也许是单线)。
综合作品
aggregate( x = df[, c(3:5)], by = df[, c(1,2)], FUN = function(x) c(n = length( !is.na(x) ), mean = mean(x, na.rm = T), sd = sd(x, na.rm = T) ) )
但是 'disaggregating' 结果(每个统计数据进入单独的数据帧)变得很尴尬。
最近我遇到了dplyr
。以下似乎有效
df %>% group_by(fac_1, fac_2) %>% summarise_each(funs(n = length( !is.na(.) ), mean(., na.rm = TRUE), sd(., na.rm = TRUE) )) # using dplyr
但是我希望能够将因子粘贴到 group_by()
中,但我还没有找到这样做的方法。
有什么帮助或想法吗?谢谢
将向量或列表传递给 dplyr 函数可能很棘手(请参阅 this vignette.)简而言之,它涉及添加额外的下划线,以使用函数的标准评估版本,然后传递向量或列表.dots
参数。
factorsToSummarise <-
c('fac_1', 'fac_2')
# extra underscore
# |
df %>% # v
group_by_(.dots = factorsToSummarise) %>%
summarise_each(funs(n = length( !is.na(.) ),
mean(., na.rm = TRUE),
sd(., na.rm = TRUE)
)) # using dplyr
假设我想计算 "dat_1" 到 [=36= 列的平均值、标准差和 n(非 NA 值的数量) ] 以下数据框,按因素 "fac_1" 和 "fac_2" 分组,以便可以从结果
访问每个统计信息(或函数)的单独数据框set.seed(1)
df <- data.frame("fac_1" = c(rep("a", 5), rep("b", 4)),
"fac_2" = c("x", "x", "y","y", "y", "y", "x", "x", "x"),
"dat_1" = c(floor(runif(3, 0, 10)), NA, floor(runif(5, 0, 10))),
"dat_2" = floor(runif(9, 10, 20)),
"dat_3" = floor(runif(9, 20, 30)))
这可以使用plyr
一次实现一个功能,因此
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { colMeans(x[, 3:5], na.rm = T) } ) # mean
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { psych::SD(x[, 3:5], na.rm = T) } ) # standrd deviation -- note uses SD from the 'psych' package
ddply(.data = df, .variables = .(df$fac_1, df$fac_2), .fun = function(x) { colSums(!is.na(x[, 3:5])) } ) # number of non-NA values
但这在使用多个函数时变得很麻烦,尤其是当必须更改感兴趣的因子和列时。我想知道是否有其他选择(也许是单线)。
综合作品
aggregate( x = df[, c(3:5)], by = df[, c(1,2)], FUN = function(x) c(n = length( !is.na(x) ), mean = mean(x, na.rm = T), sd = sd(x, na.rm = T) ) )
但是 'disaggregating' 结果(每个统计数据进入单独的数据帧)变得很尴尬。
最近我遇到了dplyr
。以下似乎有效
df %>% group_by(fac_1, fac_2) %>% summarise_each(funs(n = length( !is.na(.) ), mean(., na.rm = TRUE), sd(., na.rm = TRUE) )) # using dplyr
但是我希望能够将因子粘贴到 group_by()
中,但我还没有找到这样做的方法。
有什么帮助或想法吗?谢谢
将向量或列表传递给 dplyr 函数可能很棘手(请参阅 this vignette.)简而言之,它涉及添加额外的下划线,以使用函数的标准评估版本,然后传递向量或列表.dots
参数。
factorsToSummarise <-
c('fac_1', 'fac_2')
# extra underscore
# |
df %>% # v
group_by_(.dots = factorsToSummarise) %>%
summarise_each(funs(n = length( !is.na(.) ),
mean(., na.rm = TRUE),
sd(., na.rm = TRUE)
)) # using dplyr