我有一个像这样的数据框:
ID Value1 Value2 Value3
1 20 25 0
2 2 0 0
3 15 32 16
4 0 0 0
我想做的是仅基于非零值来计算每个人(ID)的方差,并在不可能的情况下返回NA。
因此,例如,在此示例中,ID 1的方差为var(20,25),
对于ID 2,它将返回NA,因为您不能只计算一个条目的方差;对于ID 3,则var将为var(15,32,16);对于ID 4,它将再次返回NULL,因为它没有数字全部用来计算方差。
我将如何处理?我目前有以下(不完整的)代码,但这可能不是解决问题的最佳方法:
len=nrow(d)
variances = numeric(len)
for (i in 1:len){
#get all nonzero values in ith row of data into a vector nonzerodat here
currentvar = var(nonzerodat)
Variances[i]=currentvar
}
请注意,这是一个玩具示例,但是我实际上正在使用的数据集具有40多个不同的值列来计算方差,因此容易扩展的数据集会很棒。
最佳答案
Data <- data.frame(ID = 1:4, Value1=c(20,2,15,0), Value2=c(25,0,32,0), Value3=c(0,0,16,0))
var_nonzero <- function(x) var(x[!x == 0])
apply(Data[, -1], 1, var_nonzero)
[1] 12.5 NA 91.0 NA