2017-05-30 81 views
0

我發現自己一直在編寫這一段代碼,以便爲分組均值生成標準差(然後用於繪製置信區間)。用於計算平均值,n,sd和標準差的Dplyr函數

雖然,在一行代碼中編寫我自己的函數來完成此操作將會很好。我已閱讀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){%>%group_by _(。dots = lazyeval :: lazy_dots(..) ))%>%綜述(mean_mpg =〜均值(X)) } mtcars%>%mean_mpg(缸,齒輪,MPG) 'code' 它返回的錯誤不是矢量 – spindoctor

回答

1

您可以使用函數enquo明確命名的變量在函數調用:

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)) 
} 

它給你:

> 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 

和你的榜樣的輸出中匹配:

> 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 

編輯:

的OP已要求從函數刪除group_by語句添加到GROUP_BY多個變量的能力。關於這個IMO有兩種方法。首先,您可以簡單地刪除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) 

另一種方式去了解這是使用...quos以允許函數來捕獲多個參數爲group_by聲明。這看起來像這樣:

#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'的開發版本,而不是當前最可能使用的CRAN版本。 – Axeman

+0

我終於回到了這個;我忘記了我曾問過這個問題。 但是有可能*不包括函數中的分類分組變量?有時我會一個一個地分組,有時候會有兩個分組變量。我想在自定義功能之外保持這種靈活性。但我不知道這是否可能。 – spindoctor

+0

我已經添加了一個編輯功能,可以讓您以兩種不同的方式進行編輯 – tbradley

相關問題