首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NA值存在的加权平均值

NA值存在的加权平均值
EN

Stack Overflow用户
提问于 2016-11-11 04:35:51
回答 1查看 1.4K关注 0票数 0

这里有一个非常简单的例子来说明我正在处理的问题:

代码语言:javascript
复制
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

我要做的是通过C计算每一行的CompA加权平均值。但是,请注意,CompC对于第1-3行有NAs。我希望第1-3行具有CompA和CompB的加权平均值,但一旦CompC变为活动,我希望将其自动包含在计算中。

现在看来,我做过这样的事情:

代码语言:javascript
复制
> 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行的权重。

我想要的是:

代码语言:javascript
复制
 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可用,它也包括在计算中。

因此,我想知道如何编写一些代码来获取是否存在安娜值,如果是,跳过它,但如果不包括在计算中。

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

致以问候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-11 05:04:08

给你:

代码语言:javascript
复制
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))
})

结果:

代码语言:javascript
复制
> 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值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40541172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档