R语言如何基于两列id的对应匹配关系填充指定列的缺失值
方案1:base R 实现(直接填充原有Value列)
# 构造反向id匹配查找表,仅保留Value非缺失的行 lookup <- df[!is.na(df$Value), c("id2", "id1", "Value")] colnames(lookup) <- c("id1", "id2", "fill_value") # 匹配填充缺失值 df$Value <- ifelse(is.na(df$Value), lookup$fill_value[match(paste(df$id1, df$id2), paste(lookup$id1, lookup$id2))], df$Value)
运行后直接得到填充完成的Value列,和你预期的第一种输出完全一致。
方案2:tidyverse 实现(新增Value2列存储匹配值)
如果需要保留原始Value列的原始值,单独存储匹配填充结果可以用该方案:
library(dplyr) df <- df %>% mutate( # 生成统一配对键,将两个id排序后拼接,保证正反配对的行key完全一致 pair_key = purrr::pmap_chr(list(id1, id2), ~paste(sort(c(...)), collapse = "_")) ) %>% group_by(pair_key) %>% mutate( # 同配对组内,Value缺失时取组内非缺失值填充,非缺失行的Value2设为NA Value2 = ifelse(is.na(Value), max(Value, na.rm = TRUE), NA_real_) ) %>% ungroup() %>% select(-pair_key)
运行后得到的Value2列完全符合你要求的第二种输出格式。如果同配对组存在多个非缺失值,可自行调整max()为first()、mean()等符合业务逻辑的取值规则。
内容的提问来源于stack exchange,提问作者A_Cast
相关产品推荐
相关产品推荐

