【问题标题】:Weighted average value in the presence of NA values存在 NA 值时的加权平均值
【发布时间】:2017-03-25 06:46:25
【问题描述】:

这是我正在处理的一个非常简单的示例:

data_stack <- data.table(CompA_value = c(10,20,30,40), CompB_value = c(60,70,80,80), CompC_value = c(NA, NA, NA, 100), CompA_weight = c(0.2, 0.3,0.4,0.4), CompB_weight = c(0.8,0.7,0.6,0.4), CompC_weight = c(NA, NA, NA,0.2))

   CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight
1:          10          60          NA          0.2          0.8           NA
2:          20          70          NA          0.3          0.7           NA
3:          30          80          NA          0.4          0.6           NA
4:          40          80         100          0.4          0.4          0.2

我想做的是为每一行计算 CompA 到 C 的加权平均值。但是,请注意 CompC 对第 1-3 行有 NA。我希望第 1-3 行具有 CompA 和 CompB 的加权平均值,但是一旦 CompC 激活,我希望它自动包含在计算中。

就目前而言,我做了这样的事情:

> data_stack[, Weighted_average := CompA_value*CompA_weight + CompB_value*CompB_weight + CompC_value * CompC_weight]
> data_stack
   CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight Weighted_average
1:          10          60          NA          0.2          0.8           NA               NA
2:          20          70          NA          0.3          0.7           NA               NA
3:          30          80          NA          0.4          0.6           NA               NA
4:          40          80         100          0.4          0.4          0.2               68

但我的“Weighted_average”列显然不会给我前 1-3 行的权重。

我想要的是:

 data_stack[, Weighted_average := c((10*0.2 + 60*0.8),(20*0.3 + 70*0.7),(30*0.4 + 80*0.6),(40*0.4 + 80*0.4 + 100*0.2))]
 data_stack
   CompA_value CompB_value CompC_value CompA_weight   CompB_weight CompC_weight   Weighted_average
1:          10          60          NA          0.2          0.8           NA               50
2:          20          70          NA          0.3          0.7           NA               55
3:          30          80          NA          0.4          0.6           NA               60
4:          40          80         100          0.4          0.4          0.2               68

因此,请注意前三行如何只是 A 和 B 的加权平均值,但一旦 C 可用,它也会包含在计算中。

所以我想知道如何编写一些代码来检测是否存在 NA 值,如果有,则跳过它,但如果没有,则将其包含在计算中。

我有一个相当大的数据表,所以手动操作是不可能的!

问候。

【问题讨论】:

  • 您可以将所有的 NA 替换为 0,然后取一个加权平均值。
  • 为什么不试试data_stack[is.na(data_stack)] &lt;- 0

标签: r data.table na weighted-average


【解决方案1】:

给你:

data_stack$Weighted_average = apply(data_stack,1,function(x){
  y = c(x["CompA_value"]*x["CompA_weight"],
        x["CompB_value"]*x["CompB_weight"],
        x["CompC_value"]*x["CompC_weight"])
  return(sum(y,na.rm = T))
})

结果:

> data_stack
  CompA_value CompB_value CompC_value CompA_weight CompB_weight CompC_weight Weighted_average
1          10          60          NA          0.2          0.8           NA               50
2          20          70          NA          0.3          0.7           NA               55
3          30          80          NA          0.4          0.6           NA               60
4          40          80         100          0.4          0.4          0.2               68

该函数为每列创建一个值*权重的向量。然后返回忽略 NA 值的总和。这意味着这将忽略任何列中的 NA 值。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2017-08-06
    • 2019-07-24
    • 2014-05-12
    • 2010-12-13
    相关资源
    最近更新 更多