R语言:如何按city、tr分组用已有数据均值替换NA值
问题:按city和tr分组替换values列的NA为对应分组非NA值的均值
需求说明:需将数据框中values列的NA值,替换为相同city和tr分组下已有非NA数据的均值。例如PE城市T1时段CN组的NA,用PE城市T0时段CN组的均值替换;T1时段TN组的NA用对应分组均值替换。
可复现代码:
city <- c(rep("PE", 12), rep("BN", 12), rep("CA", 12)) time <- c(rep("T0",6 ), rep("T1", 6), rep("T0",6 ), rep("T1", 6), rep("T0",6), rep("T1", 6)) tr <- c(rep("CN", 3), rep("TN", 3), rep("CN", 3), rep("TN", 3),rep("CN", 3), rep("TN", 3), rep("CN", 3), rep("TN", 3), rep("CN", 3), rep("TN", 3), rep("CN", 3), rep("TN", 3)) values<- c(20, 15,32, 16,42,56, rep(NA, 6), 23, 10,14, 41,34,56, rep(NA, 6), 23, 11,14, 21,35,46, rep(NA, 6)) df <- data.frame(city, time, tr, values)
解决方案
方法1:使用dplyr包
通过分组计算均值,批量替换NA值:
library(dplyr) df_filled <- df %>% group_by(city, tr) %>% # 计算分组内非NA值的均值,替换对应分组的NA mutate(values = ifelse(is.na(values), mean(values, na.rm = TRUE), values)) %>% ungroup()
方法2:使用data.table包(适合大数据场景)
library(data.table) # 转换为data.table格式 setDT(df) # 按city和tr分组,替换NA为分组均值 df[, values := ifelse(is.na(values), mean(values, na.rm = TRUE), values), by = .(city, tr)]
验证结果
以PE城市为例:
- CN组非NA值为20、15、32,均值为
(20+15+32)/3 = 22.333...,T1时段CN组的NA会被替换为该值 - TN组非NA值为16、42、56,均值为
(16+42+56)/3 = 38,T1时段TN组的NA会被替换为该值
内容的提问来源于stack exchange,提问作者i.b
相关产品推荐
相关产品推荐

