如何将一个dataframe中的NA值同步到另一个dataframe的相同位置?
问题:根据ref数据框的NA位置更新main数据框对应值
需求:将main数据框中,与ref数据框里NA值所在的相同行列位置的数值,替换为NA。
示例数据
# 创建main数据框 main <- data.frame(Q1 = 1:5, Q2 = rev(1:5), Q3 = c(4, 5, 1, 2, 3)) # 创建ref数据框 ref <- data.frame(Q1 = c(0.4, NA, 1.6, 1.1, 0.9), Q2 = c(NA, 2.7, 1.8, 1.5, 0.8), Q3 = c(1.3, 0.9, NA, NA, 2.6)) # 查看原始main main # Q1 Q2 Q3 # 1 1 5 4 # 2 2 4 5 # 3 3 3 1 # 4 4 2 2 # 5 5 1 3 # 查看ref ref # Q1 Q2 Q3 # 1 0.4 NA 1.3 # 2 NA 2.7 0.9 # 3 1.6 1.8 NA # 4 1.1 1.5 NA # 5 0.9 0.8 2.6
期望结果
main # Q1 Q2 Q3 # 1 1 NA 4 # 2 NA 4 5 # 3 3 3 NA # 4 4 2 NA # 5 5 1 3
解决方案
方法1:基础R(最简洁高效)
利用逻辑矩阵直接赋值,一步到位:
main[is.na(ref)] <- NA
逻辑说明:is.na(ref)会生成一个和两个数据框维度完全匹配的逻辑矩阵,其中TRUE对应ref中NA的位置。通过这个矩阵索引main,直接将对应位置设为NA。
方法2:tidyverse/dplyr风格
适合习惯tidyverse语法的用户,通过遍历列实现:
library(dplyr) main <- main %>% mutate(across(everything(), ~ ifelse(is.na(ref[[cur_column()]]), NA, .x)))
逻辑说明:用across遍历main的所有列,对每一列,匹配ref中对应列的位置,若ref该位置是NA,则将main对应值替换为NA,否则保留原数值。
内容的提问来源于stack exchange,提问作者user20291515
相关产品推荐
相关产品推荐

