计算加权平均值时处理缺失值

时间:2018-07-05 08:19:26

标签: r dataframe

假设我具有以下数据框:

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")

我想向数据帧添加加权均值,当NA存在时将其丢弃。例如,在第一行中,我们仅采用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)

3 个答案:

答案 0 :(得分:2)

使用:

df$Wmean <- rowSums(df[1:3] * df[4:6], na.rm = TRUE) / rowSums(df[4:6], 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

如果您事先不知道VW列的位置,则可以这样做(就像@Ronak处理startsWith一样):

Vi <- grep("^V", names(df))
Wi <- grep("^W", names(df))

df$Wmean <- rowSums(df[Vi] * df[Wi], na.rm = TRUE) / rowSums(df[Wi], na.rm = TRUE)

答案 1 :(得分:2)

我们可以分别收集具有“ 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

答案 2 :(得分:2)

您也可以将NA替换为0,并以此方式进行操作:

df[is.na(df)] <- 0
df$mean = ((df$V1 * df$W1) + (df$V2 * df$W2) + (df$V3 * df$W3))/(df$W1 + df$W2 + df$W3)

输出:

  V1 V2 V3   W1   W2   W3 mean
1  5  0  0 1.00 0.00 0.00    5
2  0  2  2 0.00 0.50 0.50    2
3  0  0  0 0.00 0.00 0.00  NaN
4  1  1  1 0.33 0.33 0.33    1