R:找出每行中所有非零元素的方差

use*_*065 2 conditional loops r

我有一个像这样的数据帧:

ID  Value1  Value2  Value3
1   20      25      0
2   2       0       0
3   15      32      16
4   0       0       0
Run Code Online (Sandbox Code Playgroud)

我想要做的是仅根据非零值计算每个人(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
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个玩具示例,但我实际使用的数据集有超过40个不同的值列来计算方差,因此容易扩展的内容会非常好.

Whi*_*ard 5

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
Run Code Online (Sandbox Code Playgroud)

  • 不要单独调用`!`和`==`,而是使用`!=` (3认同)