2017-09-06 47 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