2017-05-30 23 views
0

私は自分自身がグループ手段の標準誤差を生成する(信頼区間をプロットするために使用する)このコードを書くのを常に知っています。平均、n、sdと標準誤差を計算するDplyr関数

ただし、コードの1行でこれを行うために私自身の関数を書くのは良いことです。私は非標準評価でdplyrのnseビネットを、this blog postも読んでいます。私はそれを少しでもとしますが、私は自分自身でこれを理解するにはあまりにも多くの人です。助けてもらえますか?ありがとう。

var1<-sample(c('red', 'green'), size=10, replace=T) 
var2<-rnorm(10, mean=5, sd=1) 
df<-data.frame(var1, var2) 
df %>% 
group_by(var1) %>% 
summarize(avg=mean(var2), n=n(), sd=sd(var2), se=sd/sqrt(n)) 
+0

試したことを表示できますか?どこで立ち往生しましたか? [nse]タグのいくつかの質問を見てください。 – Axeman

+0

さて、私はブログの記事でこのコードを使って遊んでいた: 'code'mean_mpg = function(data、...、x){ data%>%group_by _(。dots = lazyeval :: lazy_dots(.. 。))%>%のsummarize(mean_mpg =〜)(x)の } mtcarsを意味%>%mean_mpg(CYL、ギア、MPG) 'code' それはあなたがおそらくことに注意してくださいないベクトル – spindoctor

答えて

1
あなたが明示的関数呼び出しで変数に名前を付ける機能 enquoを使用することができ

> my_fun(df, var1, var2) 
# A tibble: 2 x 5 
    var1  avg  n  sd  se 
    <fctr> <dbl> <int>  <dbl>  <dbl> 
1 green 4.873617  7 0.7515280 0.2840509 
2 red 5.337151  3 0.1383129 0.0798550 

をし、それはあなたの例の出力に含まに一致します。あなたに与え

my_fun <- function(x, cat_var, num_var){ 
    cat_var <- enquo(cat_var) 
    num_var <- enquo(num_var) 

    x %>% 
    group_by(!!cat_var) %>% 
    summarize(avg = mean(!!num_var), n = n(), 
       sd = sd(!!num_var), se = sd/sqrt(n)) 
} 

> df %>% 
+ group_by(var1) %>% 
+ summarize(avg=mean(var2), n=n(), sd=sd(var2), se=sd/sqrt(n)) 
# A tibble: 2 x 5 
    var1  avg  n  sd  se 
    <fctr> <dbl> <int>  <dbl>  <dbl> 
1 green 4.873617  7 0.7515280 0.2840509 
2 red 5.337151  3 0.1383129 0.0798550 

EDIT:

OPは、複数の変数をGROUP_BYする機能を追加する機能からgroup_byステートメントを削除するよう求められています。このIMOについては、2つの方法があります。まず、group_byステートメントを削除し、グループ化されたデータフレームを関数にパイプするだけです。その方法は、次のようになります。これについて移動する

my_fun <- function(x, num_var){ 
    num_var <- enquo(num_var) 

    x %>% 
    summarize(avg = mean(!!num_var), n = n(), 
       sd = sd(!!num_var), se = sd/sqrt(n)) 
} 

df %>% 
    group_by(var1) %>% 
    my_fun(var2) 

もう一つの方法は、group_by文に対して複数の引数をキャプチャする機能を可能にするために...quosを使用することです。これは次のようになります。

#first, build the new dataframe 
var1<-sample(c('red', 'green'), size=10, replace=T) 
var2<-rnorm(10, mean=5, sd=1) 
var3 <- sample(c("A", "B"), size = 10, replace = TRUE) 
df<-data.frame(var1, var2, var3) 

# using the first version `my_fun`, it would look like this 
df %>% 
    group_by(var1, var3) %>% 
    my_fun(var2) 

# A tibble: 4 x 6 
# Groups: var1 [?] 
    var1 var3  avg  n  sd  se 
    <fctr> <fctr> <dbl> <int>  <dbl>  <dbl> 
1 green  A 5.248095  1  NaN  NaN 
2 green  B 5.589881  2 0.7252621 0.5128378 
3 red  A 5.364265  2 0.5748759 0.4064986 
4 red  B 4.908226  5 1.1437186 0.5114865 

# Now doing it with a new function `my_fun2` 
my_fun2 <- function(x, num_var, ...){ 
    group_var <- quos(...) 
    num_var <- enquo(num_var) 

    x %>% 
    group_by(!!!group_var) %>% 
    summarize(avg = mean(!!num_var), n = n(), 
       sd = sd(!!num_var), se = sd/sqrt(n)) 
} 

df %>% 
    my_fun2(var2, var1, var3) 

# A tibble: 4 x 6 
# Groups: var1 [?] 
    var1 var3  avg  n  sd  se 
    <fctr> <fctr> <dbl> <int>  <dbl>  <dbl> 
1 green  A 5.248095  1  NaN  NaN 
2 green  B 5.589881  2 0.7252621 0.5128378 
3 red  A 5.364265  2 0.5748759 0.4064986 
4 red  B 4.908226  5 1.1437186 0.5114865 
+0

エラーを返しましたこれは 'dplyr'の開発版でのみ有効です.OPは現在使用している可能性の高いCRAN版ではありません。 – Axeman

+0

私はついにこれに戻ります。私はこれを忘れてしまった。 しかし、カテゴリ分類変数を関数に含めることはできませんか?時々私は1つずつ、時には2つのグループ化変数でグループ化します。私はカスタム機能の外でその柔軟性を保ちたいと思います。しかし、それが可能かどうかはわかりません。 – spindoctor

+0

私はこれを2通りの方法で行うことができる編集を追加しました – tbradley

関連する問題