如何用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
相关产品推荐
相关产品推荐

