2017-05-30 3 views
0

Ich schreibe dieses Bit des Codes die ganze Zeit, um Standardfehler für Gruppenmittel zu erzeugen (um dann für das Zeichnen von Konfidenzintervallen zu verwenden).Dplyr-Funktion zur Berechnung von Mittelwert, n, sd und Standardfehler

Es wäre schön, meine eigene Funktion zu schreiben, um dies in einer Zeile Code zu tun. Ich habe die nse Vignette in dplyr auf Nicht-Standard-Bewertung und this blog post sowie gelesen. Ich bekomme es etwas, aber ich bin zu viel von einem Noob, um das herauszufinden, auf eigene Faust. Kann mir jemand helfen? Vielen Dank.

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

Können Sie zeigen, was Sie versucht haben? Wo bist du stecken geblieben? Sehen Sie sich einige der Fragen im [nse] -Tag an. – Axeman

+0

Nun, ich spielte mit diesem Code im Blog post: 'code'mean_mpg = Funktion (Daten, ..., x) { Daten%>% group_by _ (. Dots = lazyeval :: lazy_dots (.. %.))>% summarize (mean_mpg = ~ mean (x)) } mtcars%>% mean_mpg (Zyl, Getriebe, mpg) ' code' Es den Fehler kein Vektor zurückgegeben – spindoctor

Antwort

1

Sie die Funktion enquo explizit verwenden können, um die Variablen in Ihrer Funktion Rufname:

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

, die Sie gibt:

> 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 

und entspricht dem Ausgang Ihres Beispiel:

> 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:

Die OP hat darum gebeten, die group_by Anweisung aus der Funktion zu entfernen, die Fähigkeit hinzuzufügen, mehr als eine Variablen GROUP_BY. Es gibt zwei Möglichkeiten, über diese IMO zu gehen. Zuerst können Sie einfach die group_by Anweisung entfernen und einen gruppierten Datenrahmen in die Funktion leiten. Das Verfahren würde wie folgt aussehen:

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) 

Ein weiterer Weg zu gehen, darüber ist ... und quos zu verwenden, um damit für die Funktion mehr Argumente für die group_by Aussage zu erfassen. Das würde so aussehen:

#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

Sie sollten wahrscheinlich beachten Sie, dass das funktioniert nur in der dev-Version von 'dplyr', _not_ der aktuellen CRAN-Version, die OP am wahrscheinlichsten verwendet. – Axeman

+0

Ich komme endlich wieder dazu; Ich hatte vergessen, dass ich das gefragt hatte. Aber ist es möglich * die kategorialen Gruppierungsvariablen nicht in die Funktion aufzunehmen? Manchmal gruppiere ich nach einer, manchmal nach zwei Gruppierungsvariablen. Ich möchte diese Flexibilität außerhalb der benutzerdefinierten Funktion beibehalten. Aber ich weiß nicht, ob das möglich ist. – spindoctor

+0

Ich habe eine Bearbeitung hinzugefügt, mit der Sie dies auf zwei verschiedene Arten tun können – tbradley

Verwandte Themen