2016-03-24 12 views
0

Meines Datenrahmen sieht wie folgt in R (aber viel größer):Standardabweichung in Abhängigkeit von variablen

x<-c(1,2,3,4,5,6) 
y<-c(2,5,3,4,9,63) 
run<-c(1,1,2,2,1,1) 
studie<-c("stu1","stu1","stu1","stu1","stu2","stu2") 
df<-data.frame(x,y,run,studie) 

ich die Standardabweichung für jede Spalte berechnet werden soll (in diesem Fall nur x und y) für jeden läufst auf jede Studie, sd für jede Studie und schließlich eine SD für die ganze Spalte. Ein bisschen verwirrend Erklärung aber in diesem Fall wäre es eine sd für (auf x):

(1,2) since they both are in studie 1 and on run 1, 
(3,4) since they both are in studie 1 and on run 2, 
(5,6) since they both are in studie 2 and on run 1, 
(1,2,3,4) since they are in studie 1 
(5,6) since they are in studie 2 
(1,2,3,4,5,6) since they are in column 1. 

Ich denke, ich sollte Funktion anwenden verwenden, aber kann nicht herausfinden, wie es funktioniert.

Antwort

3

In Basis R studie, können Sie aggregate() und dann sapply():

aggregate(cbind(x,y)~run+studie,df,sd); 
## run studie   x   y 
## 1 1 stu1 0.7071068 2.1213203 
## 2 2 stu1 0.7071068 0.7071068 
## 3 1 stu2 0.7071068 38.1837662 
aggregate(cbind(x,y)~studie,df,sd); 
## studie   x   y 
## 1 stu1 1.2909944 1.290994 
## 2 stu2 0.7071068 38.183766 
sapply(df[c('x','y')],sd); 
##   x   y 
## 1.870829 23.963862 

auch, falls Sie die Zielspalten parametrieren wollen (erfordert die Nicht-Formel-Schnittstelle von aggregate() verwenden):

vars <- c('x','y'); 
aggregate(df[vars],df[c('run','studie')],sd); 
## run studie   x   y 
## 1 1 stu1 0.7071068 2.1213203 
## 2 2 stu1 0.7071068 0.7071068 
## 3 1 stu2 0.7071068 38.1837662 
aggregate(df[vars],df['studie'],sd); 
## studie   x   y 
## 1 stu1 1.2909944 1.290994 
## 2 stu2 0.7071068 38.183766 
sapply(df[vars],sd); 
##   x   y 
## 1.870829 23.963862 
+0

Okey, das sieht ziemlich gut aus. Ich habe 100 Farben, für die ich die SD berechnen möchte, also habe ich versucht, vars <-df [, 1: 100]; Aggregat (vars ~ run. + Studie, df, sd) hat aber den Fehler ungültigen Typ (Liste) für die Variable 'vars' – PrincessJellyfish

+0

Zwei Korrekturen: (1) 'vars' muss den Namen/Indizes der zugewiesen werden Spalten, verwenden Sie also 'vars <- 1: 100;', und (2) müssen Sie die Nicht-Formel-Schnittstelle von 'aggregate()' verwenden, wenn Sie die Zielspalten mit 'vars' parametrisieren wollen, also aggregate (df [vars], df [c ('run', 'studie')], sd); '. – bgoldst

0

Wenn bezüglich Gruppierung

library(dplyr) 
df %>% group_by(studie,run) %>% summarise(Sd= sd(x)) 

studie und ausgeführt werden, wenn in Bezug Gruppierung

df %>% group_by(studie) %>% summarise(Sd= sd(x)) 

Für alle die Spalte

sd(df$x) 
1

Wir data.table verwenden

library(data.table) 
setDT(df)[, .(Sd= sd(x)) , by = .(studie, run)] 

und für beide Spalten lapply nach Angabe der .SDcols als 'x' und 'y' verwenden.

setDT(df)[, lapply(.SD, sd), by = .(studie, run), .SDcols = x:y] 
Verwandte Themen