You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将同结构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:01:11