2016-10-18 3 views
0
ID cat1 cat2 cat3 loss 
1 A B D 2213.18 
2 A B A 1283.60 
3 A B B 3005.09 
4 B A A 939.85 
5 A B C 2763.85 
6 A A A 5142.87 

Es gibt 116 kategorische Variablen von verschiedenen Ebenen, von denen ich drei aufgeführt habe. Im Folgenden ist die Funktion, die ich verwendet habe Mittelwert (Verlust) für jede Ebene in einer Variablendynamische Funktion zur Dummy-Variablenerstellung in R

a1<-summarise(group_by(ins,cat85), cat85_mean=mean(loss)) 

einen Code benötigen zu berechnen, die dynamisch diese so für die verbleibenden Variablen tut, dass ich den Mittelwert (Verlust) für alle kategorischen haben Variablen über verschiedene Ebenen hinweg

ZB: Cat85 hat 4 Ebenen nämlich A, B, C und D. Die Funktion sollte den Mittelwert (Verlust) für A, B, C und D wie A-2000, B-1234.5, C erzeugen -5667.5, D-3465.2.

Danke!

+1

Verwenden Sie 'dput()', um Ihre Beispieldaten bereitzustellen, wie in http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example gezeigt. Dies ermöglicht das Kopieren/Einfügen Ihrer Beispieldaten. –

+0

@tobiasegli_te Sicher. Werde es hier tun. Vielen Dank! –

Antwort

1

hier ein Lösung unter Verwendung dplyr:

lapply(grep("cat",names(ins), value = T),function(x){ 
    summarise(group_by_(ins,.groups=x), catX_mean=mean(loss)) 
}) 

[[1]] 
# A tibble: 2 × 2 
    .groups catX_mean 
    <chr>  <dbl> 
1  A 0.04570735 
2  B 0.76317575 

Der Kürze halber zeige ich nur das Ergebnis für die erste Spalte. Beachten Sie, dass ich für "Verlust" andere Werte verwendet habe als in den Beispieldaten.

+0

Ich bekomme eine leere Liste, wenn dieser Code. So etwas zu erwarten erzeugt den Mittelwert (Verlust) für verschiedene Ebenen in jeder Variablen. Ich denke, es gibt keinen anderen Weg, als Datensätze für jede kategorische Variable zu erstellen. Bitte lassen Sie mich wissen, ob es eine bessere Möglichkeit gibt, dies zu tun –

+0

@AmitMiskin Es gab einen Tippfehler, in dem Code, bitte versuchen Sie es erneut –

+0

Es funktionierte. Vielen Dank! –

1

Zuerst erhalten Sie die kategorischen Variablennamen in einen Vektor. Unter der Annahme, sie alle mit "cat" beginnen:

nn <- grep("cat", names(foo), value=TRUE) 

dann den Mittelwert von finden Wert für jede kategoriale Variable:

foo <- lapply(nn, 
       function(n, dat) { 
        tapply(dat$loss, dat[,n], mean) 
       }, 
       ins[,c(nn,"loss")]) 

Und die Listenelemente nennen:

names(ins) <- nn 
+0

hrm ... Ich dachte über einen Weg nach, dies mit dplyr zu machen, und es kam mir nur so vor, dass es eine 'summarize_each'-Funktion gibt, aber ich glaube nicht, dass es eine' group_by_each' oder so ... vielleicht das gibt Funktionalität existiert nicht? –