2017-09-06 7 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 - カラムは、単にわかりやすくするために追加されます。私は絶対にそれを必要としません。

私が見つけることができる唯一のものはsummarise_at(.vars = vars(starts_with("Sepal")), .funs = c(Mean="mean", Median="median"))でした。しかし、これはまず第1に遅く、第2に、行ではなく列に追加出力を作成します。

EDIT:結果を生成する演算は、summarise_atの内部にある必要はありません。

+0

。操作列のポイントは何ですか?種別に分類する以外に、各列の一部に適用される平均値または中央値のみを求めますか?または、Sepal.widthに平均を、Sepal.widthに中央値を適用したいだけですか? – user2738526

+0

私はコードの下に書いています。操作欄には、最初の3行が種に対する手段であることが明確に示されています。私はすべての列に "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

高速ソリューションをお寄せいただきありがとうございます。一般的には、 'summarize_at(.vars = vars(starts_with(" Sepal "))、.funs = c(n1 ="平均 "、n2 ="中央値 "))'を使用するのと同じように見えます。少なくとも3行目と4行目で。 – 5th

+0

確かに。個人の好み... – Sotos

関連する問題