基于参考数据框有条件替换数据框列表中的指定值
解决方案:基于参考标记替换数据框列表中的值
核心思路
- 先对齐
outside_list与main_list的idvar,移除outside_list中不存在于对应main_list数据框的额外行 - 依据
ref数据框中标记为"bad"的idvar和列,将main_list对应位置的值替换为对齐后的outside_list值
代码实现
1. 构造示例数据(可替换为你的真实数据)
# 示例main_list:包含idvar和数值列 main_list <- list( df1 = data.frame(idvar = c("A", "B", "C"), col1 = c(1, 2, 3), col2 = c(4, 5, 6), col3 = c(7, 8, 9)), df2 = data.frame(idvar = c("X", "Y"), col1 = c(10, 20), col2 = c(30, 40), col3 = c(50, 60)) ) # 示例outside_list:包含额外行 outside_list <- list( df1 = data.frame(idvar = c("A", "B", "C", "D"), col1 = c(11, 22, 33, 44), col2 = c(44, 55, 66, 77), col3 = c(77, 88, 99, 100)), df2 = data.frame(idvar = c("X", "Y", "Z"), col1 = c(110, 220, 330), col2 = c(330, 440, 550), col3 = c(550, 660, 770)) ) # 示例ref:标记bad的idvar和列 ref <- data.frame( idvar = c("A", "B", "Y"), col = c("col1", "col3", "col2"), status = c("bad", "bad", "bad") )
2. 对齐outside_list的行
# 移除outside_list中main_list没有的idvar行 aligned_outside <- mapply(function(main_df, outside_df) { outside_df[outside_df$idvar %in% main_df$idvar, ] }, main_list, outside_list, SIMPLIFY = FALSE)
3. 执行替换逻辑
# 定义单数据框的替换函数 replace_bad_vals <- function(main_df, outside_df, ref_df) { res_df <- main_df # 遍历每条bad规则 for (i in seq(nrow(ref_df))) { target_id <- ref_df$idvar[i] target_col <- ref_df$col[i] if (ref_df$status[i] == "bad") { # 定位并替换对应值 res_df[res_df$idvar == target_id, target_col] <- outside_df[outside_df$idvar == target_id, target_col] } } return(res_df) } # 应用到整个数据框列表 final_main <- mapply(replace_bad_vals, main_list, aligned_outside, MoreArgs = list(ref_df = ref), SIMPLIFY = FALSE)
4. 查看结果
# 查看处理后的df1 print(final_main$df1) # idvar col1 col2 col3 # 1 A 11 4 7 # A的col1被替换为outside的11(标记bad) # 2 B 2 5 88 # B的col3被替换为outside的88(标记bad) # 3 C 3 6 9 # 无bad标记,保留原值 # 查看处理后的df2 print(final_main$df2) # idvar col1 col2 col3 # 1 X 10 30 50 # 无bad标记,保留原值 # 2 Y 20 440 60 # Y的col2被替换为outside的440(标记bad)
内容的提问来源于stack exchange,提问作者jrcalabrese
相关产品推荐
相关产品推荐

