【问题标题】:R: Find the Variance of all Non-Zero Elements in Each RowR:查找每行中所有非零元素的方差
【发布时间】:2015-10-30 08:21:39
【问题描述】:

我有一个这样的数据框:

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 多个不同的值列来计算方差,因此可以轻松扩展的东西会很棒。

【问题讨论】:

  • apply(df[-1], 1, function(x) var(x[x != 0]))
  • 您可能还想考虑matrixStats 包中的rowVars

标签: r loops conditional


【解决方案1】:
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

【讨论】:

  • 嗨,谢谢,输出看起来正确。我知道 apply 正在获取数据帧(第一个参数),查看每一行(第二个参数)并将 var_nonzero 函数应用于每一行。但是它怎么知道不包括 id 列,以及你是如何定义一个没有 function(things){ 函数的东西,包括 return 语句 } 语法的函数?
  • 我忽略了第一列。请看编辑 Data[, -1]
  • 你可以使用!=而不是分别调用!==
  • 好主意。感谢您的提示
【解决方案2】:

这看起来有点过头了,但它确实有效,它会返回一个带有附加到统计信息的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多