2016-12-26 15 views
0

私はグループ化されたデータセットを扱っており、4つの新しい列として4つの集計統計を追加したいと思っています:count、mean、ci lower、ci upper。異なる数の戻り値を返す異なる関数を持つグループ化されたデータを要約する方法はありますか?

私は、次のような上位のCI、低級C、平均要約:

library(Hmisc) 
library(dplyr) 

# summarize count, mean, confidence intervals and make four new columns; 
mtcars %>% group_by(vs, am) %>% 
    do(
     as.data.frame(as.list(smean.cl.normal(.$mpg))) 
    ) 
#  vs am  Mean Lower Upper 
# <dbl> <dbl> <dbl> <dbl> <dbl> 
# 1  0  0 15.05000 13.28723 16.81277 
# 2  0  1 19.75000 15.54295 23.95705 
# 3  1  0 20.74286 18.45750 23.02822 
# 4  1  1 28.37143 23.97129 32.77157 

私は、カウントを追加するときしかし、新しい列がリストの2列になっ:

df <- mtcars %>% group_by(vs, am) %>% 
    do(
     n = length(.$mpg), 
     stats = smean.cl.normal(.$mpg) 
    ) 

# # A tibble: 4 × 4 
#  vs am   n  stats 
# * <dbl> <dbl> <list> <list> 
# 1  0  0 <int [1]> <dbl [3]> 
# 2  0  1 <int [1]> <dbl [3]> 
# 3  1  0 <int [1]> <dbl [3]> 
# 4  1  1 <int [1]> <dbl [3]> 

私の所望の出力がされます:

#  vs am  n  Mean Lower Upper 
# <dbl> <dbl> <int> <dbl> <dbl> <dbl> 
# 1  0  0 12 15.05000 13.28723 16.81277 
# 2  0  1  6 19.75000 15.54295 23.95705 
# 3  1  0  7 20.74286 18.45750 23.02822 
# 4  1  1  7 28.37143 23.97129 32.77157 

これをどのようにすれば便利ですか?

ありがとうございます。


私も試してみました:

mtcars %>% group_by(vs, am) %>% 
    do(
     as.data.frame(as.list(c(length(.$mpg), smean.cl.normal(.$mpg)))) 
    ) 

# Source: local data frame [4 x 8] 
# Groups: vs, am [4] 
# 
# vs am X12  Mean Lower Upper X6 X7 
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
# 1  0  0 12 15.05000 13.28723 16.81277 NA NA 
# 2  0  1 NA 19.75000 15.54295 23.95705  6 NA 
# 3  1  0 NA 20.74286 18.45750 23.02822 NA  7 
# 4  1  1 NA 28.37143 23.97129 32.77157 NA  7 

これは奇妙な結果が得られます。

+3

なぜ、2度目の試みでは、それを 'data.frame'にまとめなかったのですか?あなたはそれがなくて突然仕事をするべきだと主張したのはなぜですか?私は単純に 'mtcars%>%group_by(vs、am)%>%do(as.data.frame(as.list(c = n = length(。$ mpg) 、smean.cl.normal(。$ mpg))))) '、いいえ? –

+0

@DavidArenburg私は同様の方法で試しました: 'mtcars%>%group_by(vs、am)%>% do( as.data.frame(as.list(c(length(。$ mpg)、smean.cl .normal(。$ mpg))))) ) '。これは、 "NA"で奇妙な列を与えます。だから私はこれがうまくいかないと思う。なぜ私は 'n ='なしで奇妙な結果を得るのですか? – mt1022

+1

dplyrはスマートにしようとしているので、 'paste0(" X "、length(。$ mpg))'というようにして新しい名前を割り当てます。フレームは新しい名前で毎回新しい列を追加します –

答えて

1

あなたはすなわちtidyrdplyrpurrrbroom、複数のtidyverseのパッケージを使用してdoせずにこれを実現することができます。対によって

  1. グループを、リストフレームに
  2. 巣MPG午前:

    この背後にある理由はdo will eventually be replaced by purrr

    はそれがないということです。

  3. stats列とn列をリストフレームとして作成します。
  4. リストフレームを別々の行と列にネスト解除します。
  5. データリストフレームをドロップします。

あなたは私のアプローチは、列にtidyr::spread行、その後broom::tidyで整頓データフレームに出力を変換したステップ3で適切な形でsmean.cl.normalを得るために、いくつかのfinaglingを行う必要があります。それぞれのvs/amグループの適切な整頓された形式のもの。このアプローチはおそらく改善され、それらの提案がコメントに掲載されることを希望する。

library(Hmisc) 
library(tidyverse) 

mtcars %>% 
    group_by(vs, am) %>% 
    nest(mpg) %>% 
    mutate(stats = map(data, ~spread(tidy(smean.cl.normal(.x$mpg)), names, x)), 
     n = map(data, nrow)) %>% 
    unnest(stats, n) %>% 
    select(-data) 
+0

こんにちは、更新された整理方法のおかげで。 (%$)%%unnest(stats、n)%df <- mtcars %>%group_by(vs、am)%>% do( n = length(。$ mpg)、 stats = smean.cl.normal(。$ mpg) )%>%unnest ) 'は動作しませんか?ネストされた列(リストの列のように見える)は 'unnest'のリストの列と異なっていますか? – mt1022

+0

それぞれを個別にアンネストした後、行番号の違いによりdoメソッドで要約します。 –

関連する問題