2013-08-04 17 views
20

Zastanawiam się, czy istnieje funkcja wbudowana w R, która oblicza odchylenie standardowe dla kolumn, tak jak colMeans oblicza mean dla każdej kolumny. Byłoby dość łatwo napisać własną funkcję mini (złożone polecenie, które wywołuje takie rzeczy, jak apply z sd), ale zastanawiałem się, czy było już coś, co mogłem użyć, jednocześnie zachowując mój kod czysty.Standardowe odchylenie kolumny R

+0

... tam, chciałbym szczególnie polecić sgibb za 'colSdColMeans' jako szybkiego wdrożenia. – flodel

+0

dla macierzy numerycznej, dość łatwe (rozwiązania poniżej), ale co z rozwiązaniem dla ramki danych działającej tylko w kolumnach numerycznych? Lub używa argumentu formuły, aby wybrać kolumny? 'colmean (~ x1 + x2 + x3, data = d)'? – Spacedman

Odpowiedz

39

Ogólna koncepcja to zamiatanie funkcja w poprzek. Masz wiele opcji, jedna jest 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(), drugi argument, margin, "jest wektorem podającym indeksy dolne, do których funkcja zostanie zastosowana." 2 oznacza kolumny – rafaelvalle

2

Jeśli chcesz używać go z grupy, można użyć:

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

... lub bez grupowania: 'colwise (sd) (mydata)' – flodel

1

Pakiet fBasics posiada funkcję 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

Użyj funkcji colSds z biblioteki matrixStats.

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

[1] 0.8354488 1.6305844 1.1560580 1.1152688 
+0

Czy możesz dostosować to 'colSds' dla sum, nie tylko dla średnich? –

Powiązane problemy