2017-09-06 52 views
0

我想使用dplyr来计算均值,中位数和其他一些内容。因为我刚刚看了一些介绍(大多比较旧的),我想知道以下是可能的:在列和rbind上执行多个操作

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 -column只是增加了清晰度。我不是绝对需要它。

我能找到的唯一的东西是summarise_at(.vars = vars(starts_with("Sepal")), .funs = c(Mean="mean", Median="median"))。然而,这首先是缓慢的,其次是在列中创建额外的输出 - 而不是行。

编辑:我不需要产生结果的操作,在summarise_at之内。

+0

你想要的这里,我会假设你说的是什么,你想要什么还不清楚。操作栏的要点是什么?除了按物种分组以外,您是否只希望将平均值或中位数应用于每列的某个部分?或者,您是否只想将平均值应用到Sepal.Length和中值到Sepal.width? – user2738526

+0

正如我在代码下面写的。操作专栏是为了澄清前三行是物种的手段。我希望将均值和中位数应用于所有使用“Sepal”的列。 – 5th

回答

1

这是主意。诀窍是gather和清洁熔化colnames,即

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 
+0

感谢您的快速解决方案。通常这与使用'summarise_at(.vars = vars(starts_with(“Sepal”)),.funs = c(n1 =“mean”,n2 =“median”))''相同。至少在第三和第四行。 – 5th

+0

确实。个人喜好... – Sotos