2016-12-01 6 views
0

Ich habe einen großen Datensatz und muss die Standardabweichung für die Spalte Main basierend auf der Anzahl der Zeilen in anderen Spalten ermitteln. Hier ist ein Beispieldatensatz:R Bedingte Standardabweichung

df1 <- data.frame(
    Main = c(0.33, 0.57, 0.60, 0.51), 
    B = c(NA, NA, 0.09,0.19), 
    C = c(NA, 0.05, 0.07, 0.05), 
    D = c(0.23, 0.26, 0.23, 0.26) 
) 

View(df1) 
# Main B  C  D 
# 1 0.33 NA  NA  0.23 
# 2 0.57 NA  0.05 0.26 
# 3 0.60 0.09 0.07 0.23 
# 4 0.51 0.19 0.05 0.26 

Nehmen Spalte B als Beispiel, da die Zeile 1 & 2 sind NA, dessen Standardabweichung werden sd(df1[3:4,1]); Spalte C&D wird sd(df1[2:4,1]) und sd(df1[1:4,1]) sein. Daher wird das Ergebnis sein:

#  B  C  D 
# 1 0.06 0.05 0.12 

ich das Folgende tat, aber es ergab nur eine Nummer - 0.0636

df2 <- df1[,-1]!=0 

sd(df1[df2,1], na.rm = T) 

Meine Datensatz viele mehr Spalten hat, und ich frage mich, ob es eine ist effizienterer Weg, um es zu erledigen? Danke vielmals!

Antwort

1

Versuchen:

sapply(df1[,-1], function(x) sd(df1[!is.na(x), 1])) 

#   B   C   D 
# 0.06363961 0.04582576 0.12093387 
0
x <- colnames(df) # list all columns you want to calculate sd of 
value <- sapply(1:length(x) , function(i) sd(df[,x[i],drop=TRUE], na.rm = T)) 
names(value) <- x 

#   Main   B   C   D 
# 0.12093387 0.07071068 0.01154701 0.01732051 
+0

@ T-T ist das Ihre Frage beantwortet? Beachten Sie http://stackoverflow.com/help/someone-answers –

0

Wir können diese erhalten mit colSds von matrixStats

library(matrixStats) 
colSds(`dim<-`(df1[,1][NA^is.na(df1[-1])*row(df1[-1])], dim(df1[,-1])), na.rm = TRUE) 
#[1] 0.06363961 0.04582576 0.12093387