2013-08-04 23 views
20

Ich fragte mich, ob es eine eingebaute Funktion in R gab, die die Standardabweichung für Spalten wie colMeans berechnen würde, berechnet mean für jede Spalte. Es wäre einfach genug, meine eigene Mini-Funktion zu schreiben (ein zusammengesetzter Befehl, der Dinge wie apply mit sd aufruft), aber ich fragte mich, ob es schon etwas gab, das ich benutzen konnte, während ich meinen Code sauber hielt.Spalte Standardabweichung R

+0

... da würde ich sgibbs 'colSdColMeans' als schnelle Implementierung empfehlen. – flodel

+0

für eine numerische Matrix, einfach genug (Lösungen unten), aber wie wäre es mit einer Lösung für einen Datenrahmen, der nur auf numerischen Spalten funktioniert? Oder verwendet ein Formelargument zum Auswählen von Spalten? 'colmean (~ x1 + x2 + x3, Daten = d)'? – Spacedman

Antwort

39

Die allgemeine Idee ist Sweep die Funktion über. Sie haben viele Möglichkeiten, man ist apply():

R> set.seed(42) 
R> M <- matrix(rnorm(40),ncol=4) 
R> apply(M, 2, sd) 
[1] 0.835449 1.630584 1.156058 1.115269 
R> 
+3

In apply() ist das zweite Argument, margin, "ein Vektor, der die Indizes angibt, denen die Funktion zugewiesen wird." 2 zeigt Spalten – rafaelvalle

2

Wenn Sie es mit Gruppen verwenden möchten, können Sie:

library(plyr) 
mydata<-mtcars 
ddply(mydata,.(carb),colwise(sd)) 



    carb  mpg  cyl  disp  hp  drat  wt  qsec  vs  am  gear 
1 1 6.001349 0.9759001 75.90037 19.78215 0.5548702 0.6214499 0.590867 0.0000000 0.5345225 0.5345225 
2 2 5.472152 2.0655911 122.50499 43.96413 0.6782568 0.8269761 1.967069 0.5270463 0.5163978 0.7888106 
3 3 1.053565 0.0000000 0.00000 0.00000 0.0000000 0.1835756 0.305505 0.0000000 0.0000000 0.0000000 
4 4 3.911081 1.0327956 132.06337 62.94972 0.4575102 1.0536001 1.394937 0.4216370 0.4830459 0.6992059 
5 6  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
6 8  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
+1

... oder ohne Gruppierung: 'colwise (sd) (mydata)' – flodel

1

Das Paket fBasics eine Funktion colStdevs

require('fBasics') 
set.seed(123) 
colStdevs(matrix(rnorm(1000, mean=10, sd=1), ncol=5)) 
[1] 0.9431599 0.9959210 0.9648052 1.0246366 1.0351268 
15
hat

Verwenden Sie colSds Funktion von matrixStats Bibliothek.

library(matrixStats) 
set.seed(42) 
M <- matrix(rnorm(40),ncol=4) 
colSds(M) 

[1] 0.8354488 1.6305844 1.1560580 1.1152688 
+0

Können Sie diese 'colSds' für Summen anpassen, nicht nur für Mittel? –

Verwandte Themen