对列和rbind进行多次操作

时间:2017-09-06 07:24:32

标签: r dplyr

我想使用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内。

1 个答案:

答案 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