我想使用dplyr
来计算均值,中位数和其他一些东西。由于我只是阅读了一些介绍(大多数都是旧的),我想知道以下是否可行:
iris %>% group_by_("Species") %>%
summarise_at(.vars = vars(starts_with("Sepal")), .funs=perform_some_operation)
# A tibble: 6 x 4
Species Sepal.Length Sepal.Width Operation
<fctr> <dbl> <dbl> <fctr>
1 setosa 5.006 3.428 mean
2 versicolor 5.936 2.770 mean
3 virginica 6.588 2.974 mean
4 setosa 5.0 3.4 median
5 versicolor 5.9 2.8 median
6 virginica 6.5 3.0 median
为了清楚起见,我们添加了Operation
- 列。我并不是绝对需要它。
我唯一能找到的是summarise_at(.vars = vars(starts_with("Sepal")), .funs = c(Mean="mean", Median="median"))
。然而,这首先是缓慢的,其次是在列中创建额外的输出 - 而不是在行中。
编辑:我不需要生成结果的操作,在summarise_at
内。
答案 0 :(得分:1)
这是个主意。诀窍是gather
并清理熔化的同名,即
library(tidyverse)
iris %>%
group_by(Species) %>%
select(starts_with('Sepal')) %>%
summarise_all(funs(n1 = mean, n2 = median)) %>%
gather(var, val, -Species) %>%
mutate(var = gsub('_.*', '', var)) %>%
group_by(var) %>%
mutate(new = seq(n())) %>%
spread(var, val) %>%
arrange(new) %>%
select(-new)
#Adding missing grouping variables: `Species` - Innocent warning
# A tibble: 6 x 3 Species Sepal.Length Sepal.Width <fctr> <dbl> <dbl> 1 setosa 5.006 3.428 2 versicolor 5.936 2.770 3 virginica 6.588 2.974 4 setosa 5.000 3.400 5 versicolor 5.900 2.800 6 virginica 6.500 3.000