2016-11-11 141 views
0

这里是我处理的一个非常简单的例子:加权平均值值

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变为活动状态,我希望它自动包含在计算中。

既然这样,我做了这样的事情:

> 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值,如果是,则跳过它,但是如果没有将其包含在计算中。

我已经有了一个相当大的数据表,所以它手动是不可能的!

问候。

+2

您可以用0代替所有NA,然后取加权平均值。 –

+0

为什么不试试'data_stack [is.na(data_stack)] < - 0'? – Aramis7d

回答

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值。