我有一个大型数据集,我需要根据其他列中的行数得到Main
列的标准偏差。这是一个示例数据集:
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)
我的数据集有更多列,我想知道是否有更有效的方法来完成它?非常感谢!
答案 0 :(得分:1)
尝试:
sapply(df1[,-1], function(x) sd(df1[!is.na(x), 1]))
# B C D
# 0.06363961 0.04582576 0.12093387
答案 1 :(得分: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
答案 2 :(得分:0)
我们可以使用colSds
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