存在 NA 值时的加权平均值
Weighted average value in the presence of NA values
这是我正在处理的一个非常简单的例子:
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 值,如果有,则跳过它,但如果没有,则将其包括在计算中。
我有一个相当大的数据table所以手动做是不可能的!
此致。
给你:
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
该函数为每列创建一个具有值*权重的向量。然后 returns 忽略 NA 值的总和。这意味着这将忽略任何列中的 NA 值。
这是我正在处理的一个非常简单的例子:
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 值,如果有,则跳过它,但如果没有,则将其包括在计算中。
我有一个相当大的数据table所以手动做是不可能的!
此致。
给你:
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
该函数为每列创建一个具有值*权重的向量。然后 returns 忽略 NA 值的总和。这意味着这将忽略任何列中的 NA 值。