假设我具有以下数据框:
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)
答案 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
如果您事先不知道V
和W
列的位置,则可以这样做(就像@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”的列的索引,然后为每行分别收集apply
,weighted.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