如何将同结构DataFrame的NA值映射至另一DataFrame并保留非NA值
问题描述
现有两个结构完全一致的DataFrame,需要将DF1中的NA值映射到DF2的对应位置,同时保留DF2中其余所有非NA值不变。以下是可复现的示例数据及目标结果:
# 定义DF1 df1 <- structure(list(ID = c(100, 101, 102, 103), c1 = c(NA, NA, NA, "Y"), c2 = c("Y", NA, NA, "Y"), c3 = c("Y", "Y", "Y", NA), c4 = c(NA, NA, NA, NA), c5 = c(NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L)) # 定义DF2 df2 <- structure(list(ID = c(100, 101, 102, 103), c1 = c(0, 0, 0, NA), c2 = c(1, 0, 0, 0), c3 = c(0, 0, 0, 1), c4 = c(0, 0, NA, 0), c5 = c(1, 0, NA, 0)), class = "data.frame", row.names = c(NA, -4L)) # 目标结果 target_df <- structure(list(ID = c(100, 101, 102, 103), c1 = c(NA, NA, NA, NA), c2 = c(1, NA, NA, 0), c3 = c(0, 0, 0, NA), c4 = c(NA, NA, NA, NA), c5 = c(NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L))
方法一:基础R实现
通过矩阵索引定位DF1的NA位置,直接将DF2对应位置替换为NA:
# 指定需要处理的列(排除ID列) cols_to_process <- setdiff(names(df2), "ID") # 将DF1中NA对应的DF2位置设为NA df2[cols_to_process][is.na(df1[cols_to_process])] <- NA # 验证结果是否匹配目标 all.equal(df2, target_df) # [1] TRUE
方法二:tidyverse(dplyr)实现
用across()批量处理列,通过ifelse()判断DF1的NA位置并更新DF2:
library(dplyr) result_df <- df2 %>% mutate(across(-ID, ~ifelse(is.na(df1[[cur_column()]]), NA, .x))) # 验证结果是否匹配目标 all.equal(result_df, target_df) # [1] TRUE
内容的提问来源于stack exchange,提问作者Beardedant
相关产品推荐
相关产品推荐

