R:找出每一行中所有非零元素的方差
R: Find the Variance of all Non-Zero Elements in Each Row
我有一个这样的数据框:
ID Value1 Value2 Value3
1 20 25 0
2 2 0 0
3 15 32 16
4 0 0 0
我想做的是计算每个人 (ID) 的方差,仅基于非零值,并且在不可能的情况下 return NA。
例如,在此示例中,ID 1 的方差为 var(20, 25),
对于 ID 2,它将 return NA 因为您不能仅计算一个条目的方差,对于 ID 3,var 将是 var(15, 32, 16) 而对于 ID 4,它将再次 return 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
这看起来有点过头了,但它确实有效,它会返回一个带有附加到统计信息的 id 的对象:
library(reshape2)
library(dplyr)
variances <- df %>%
melt(., id.var = "id") %>%
group_by(id) %>%
summarise(variance = var(value[value!=0]))
这是我用来测试的玩具数据:
df <- data.frame(id = seq(4), X1 = c(3, 0, 1, 7), X2 = c(10, 5, 0, 0), X3 = c(4, 6, 0, 0))
> df
id X1 X2 X3
1 1 3 10 4
2 2 0 5 6
3 3 1 0 0
4 4 7 0 0
结果如下:
id variance
1 1 14.33333
2 2 0.50000
3 3 NA
4 4 NA
我有一个这样的数据框:
ID Value1 Value2 Value3
1 20 25 0
2 2 0 0
3 15 32 16
4 0 0 0
我想做的是计算每个人 (ID) 的方差,仅基于非零值,并且在不可能的情况下 return NA。
例如,在此示例中,ID 1 的方差为 var(20, 25), 对于 ID 2,它将 return NA 因为您不能仅计算一个条目的方差,对于 ID 3,var 将是 var(15, 32, 16) 而对于 ID 4,它将再次 return 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
这看起来有点过头了,但它确实有效,它会返回一个带有附加到统计信息的 id 的对象:
library(reshape2)
library(dplyr)
variances <- df %>%
melt(., id.var = "id") %>%
group_by(id) %>%
summarise(variance = var(value[value!=0]))
这是我用来测试的玩具数据:
df <- data.frame(id = seq(4), X1 = c(3, 0, 1, 7), X2 = c(10, 5, 0, 0), X3 = c(4, 6, 0, 0))
> df
id X1 X2 X3
1 1 3 10 4
2 2 0 5 6
3 3 1 0 0
4 4 7 0 0
结果如下:
id variance
1 1 14.33333
2 2 0.50000
3 3 NA
4 4 NA