You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:32