2016-12-01 96 views
0

我有一個很大的數據集,我需要根據其他列中的行數得到Main列的標準偏差。下面是一個示例數據集:R條件標準差

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 

作爲一個例子取柱B,由於第1行& 2是NA,其標準偏差將是sd(df1[3:4,1]);列C&D將是sd(df1[2:4,1])sd(df1[1:4,1])。因此,結果將是:

#  B  C  D 
# 1 0.06 0.05 0.12 

我做了如下,但只返回一個數字 - 0.0636

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

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

我的數據集有更多列,我想知道是否有更有效的方式來完成它?非常感謝!

回答

1

嘗試得到這樣的:

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它回答你的問題?注意遵循http://stackoverflow.com/help/someone-answers –

0

我們可以從colSdsmatrixStats

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