This question already has an answer here:
Weighted mean by row

(1个答案)


2年前关闭。




假设我有以下数据框:
df <- as.data.frame(rbind(c(5, NA, NA, 1, NA, NA),
                         c(NA, 2, 2, NA, 0.5, 0.5),
                         c(NA, NA, NA, NA, NA, NA),
                         c(1, 1, 1, 0.33, 0.33, 0.33)))
colnames(df) <- c("V1", "V2", "V3", "W1", "W2", "W3")

我想向数据帧添加加权均值,当它们存在时将其丢弃。例如,在第一行中,我们仅采用V1和W1来计算加权平均值。

我的最终数据框将如下所示:
   V1 V2  V3  W1   W2   W3   Wmean
1   5 NA  NA   1   NA   NA       5
2  NA  2   2  NA  0.5  0.5.      2
3  NA NA  NA  NA   NA   NA      NA
4   1  1   1  .33  .33  .33      1

请注意,加权平均值的计算方式如下:
Wmean =(V1 * W1 + V2 * W2 + V3 * W3)/(W1 + W2 + W3)

最佳答案

我们可以分别收集带有“V”和“W”的列的索引,然后为每一行收集applyweighted.mean,而忽略NA值。

V_index <- startsWith(names(df), "V")
W_index <- startsWith(names(df), "W")
df$WMean <- apply(df, 1, function(x)
                  weighted.mean(x[V_index], x[W_index], na.rm = TRUE))

df

#  V1 V2 V3   W1   W2   W3 WMean
#1  5 NA NA 1.00   NA   NA     5
#2 NA  2  2   NA 0.50 0.50     2
#3 NA NA NA   NA   NA   NA   NaN
#4  1  1  1 0.33 0.33 0.33     1

关于r - 计算加权平均值时处理缺失值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51186439/

10-12 19:52