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

如何用dplyr将R数据框缺失值替换为同框对应单元格值

用dplyr填充缺失值:匹配同农场同月份的对应值

针对你的需求,不需要写循环,用dplyr的分组操作就能高效解决,核心思路是按农场(Farm)和月份(Month)分组,提取每组内Stable=Out的食物消耗量,填充到同组内Stable=In的缺失值中。

步骤1:加载dplyr包

library(dplyr)

步骤2:处理数据并填充缺失值

# 读取示例数据
df <- read.table(text = "Farm, Month, Stable, Food_consumed
AA, Apr, Out, 45
AA, Jun, Out, 56
BB, Apr, Out, 37
BB, Jun, Out, 79
CC, Apr, Out, 24
AA, Apr, In, 
BB, Apr, In, 
CC, Apr, In, 6.7", header = TRUE, sep = ",")

# 分组填充缺失值
df_filled <- df %>%
  group_by(Farm, Month) %>%
  mutate(Food_consumed = ifelse(
    is.na(Food_consumed) & Stable == "In",  # 判断需要填充的条件
    Food_consumed[Stable == "Out"],         # 取同组内Stable=Out的对应值
    Food_consumed                           # 其他情况保留原数据
  )) %>%
  ungroup()  # 取消分组,恢复普通数据框结构

更清晰的写法(用case_when)

如果觉得ifelse逻辑不够直观,可以用case_when替代,可读性更强:

df_filled <- df %>%
  group_by(Farm, Month) %>%
  mutate(Food_consumed = case_when(
    is.na(Food_consumed) & Stable == "In" ~ Food_consumed[Stable == "Out"],
    TRUE ~ Food_consumed  # 所有其他情况保持原数值
  )) %>%
  ungroup()

结果验证

运行上述代码后,df_filled就是你期望的结果:

# 输出查看结果
print(df_filled)
#   Farm Month Stable Food_consumed
# 1   AA   Apr    Out          45.0
# 2   AA   Jun    Out          56.0
# 3   BB   Apr    Out          37.0
# 4   BB   Jun    Out          79.0
# 5   CC   Apr    Out          24.0
# 6   AA   Apr     In          45.0
# 7   BB   Apr     In          37.0
# 8   CC   Apr     In           6.7

这种方法比循环更高效,尤其适合你的大型数据集,分组操作会自动处理每个农场的匹配逻辑,不需要手动遍历。

内容的提问来源于stack exchange,提问作者Roberta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:46:11