2015-01-10 17 views
18

私はdplyrのsummarise_eachを使用して、複数のデータ列に関数を適用しています。一つのことは、すぐに複数の機能を適用できることです。つまり、出力が1行のデータフレームであることは迷惑です。それは要約された列と同じ数の列で、関数と同じ数の行を返すように思えます。関数ごとに1行を返すためにdplyrのsummarise_eachを使用しますか?

library(dplyr) 
default <- 
    iris %>% 
    summarise_each(funs(min, max), matches("Petal")) 

> desired 
     [,1]   [,2]   
variable "Petal.Length" "Petal.Width" 
min  "1.0"   "0.1"   
max  "6.9"   "2.5" 
これは私が近いものを返す

library(reshape2) 
desired <- 
    iris %>% 
    select(matches("Petal")) %>% 
    melt() %>% 
    group_by(variable) %>% 
    summarize(min=min(value),max=max(value)) %>% 
    t() 

のようなものを好むだろう

> default 
    Petal.Length_min Petal.Width_min Petal.Length_max Petal.Width_max 
1    1    0.1    6.9    2.5 

を返します(ないデータフレームを、あなたのすべてのアイデアを得ます)

はSummariにオプションがありますse_eachこれを行うには?もしそうでなければ、ハドレー、それを追加してもよろしいですか?

答えて

22

あなたはdplyrtidyrパッケージを組み合わせた同様の出力を達成することができます。

library(dplyr) 
library(tidyr) 

iris %>% 
    select(matches("Petal")) %>% 
    summarise_each(funs(min, max)) %>% 
    gather(variable, value) %>% 
    separate(variable, c("var", "stat"), sep = "\\_") %>% 
    spread(var, value) 
## stat Petal.Length Petal.Width 
## 1 max   6.9   2.5 
## 2 min   1.0   0.1 
+2

クールで少し短く(デフォルト値) 'gather%>%separate(key、c​​(" key "、" stat ")、sep =" _ ")%>%spread(key、value)' – ckluss

+0

@cklussニース、ありがとう。回答を編集して更新してください。 – dickoa

+0

非常に良い。私は最終的に見事に潜り込む理由を与えます。どうもありがとう。 –

6

私の知る限り、このような議論はありません。とにかく、きちんとしたデータを出力するための回避策があります。これは、関数と同じ行数と要約された列数の列を持つよりも優れていると思います。

library("dplyr") 
library("tidyr") 

iris %>% 
    summarise_each(funs(min, max, mean, median), matches("Petal")) %>% 
    t %>% 
    as.data.frame %>% 
    add_rownames %>% 
    separate(rowname, into = c("feature", "fun"), sep = "_") 

リターン(add_rownamesdplyr 0.4.0が必要であることに注意してください):

 feature fun  V1 
1 Petal.Length min 1.000000 
2 Petal.Width min 0.100000 
3 Petal.Length max 6.900000 
4 Petal.Width max 2.500000 
5 Petal.Length mean 3.758000 
6 Petal.Width mean 1.199333 
7 Petal.Length median 4.350000 
8 Petal.Width median 1.300000 
+0

多くの状況でこのフォーマットが役立つことがわかりました。ありがとう! –

+0

小規模の注意: 'add_rownames()'は廃止予定ですので、代わりに 'tibble :: rownames_to_column()'を使用することをお勧めします。 –

2

一つの選択肢を助けることができ、これらの線に沿って 何かが結果のベクトルを作る機能が(今のところ大丈夫ですbind_colsmap_dfかかわらでdata.frameに戻って簡素化するために本当にmap_dfcpurrr::map_dfを使用することですそれぞれの機能、すなわち

library(tidyverse) 

iris %>% select(contains('Petal')) %>% 
    map_dfc(~c(min(.x), max(.x))) %>% 
    mutate(stat = c('min', 'max')) # to add column of function names 

#> # A tibble: 2 × 3 
#> Petal.Length Petal.Width stat 
#>   <dbl>  <dbl> <chr> 
#> 1   1.0   0.1 min 
#> 2   6.9   2.5 max 
+0

[tidyverse news](http://purrr.tidyverse.org/news/#purrr-and-dplyr)ごとに、新しいバージョンの「purrr」の 'dmap' - >' map_df'を変更しました。 – Paul

関連する問題