如何叠加两个同结构DataFrame并按需替换NA值?
解决方案
步骤1:修正数据类型
你提供的代码里,DF1和DF2的数值列是字符型(包含字符串"NA"),需要先转换成数值型并将"NA"转为R的真实NA值:
# 转换字符型"NA"为真实NA,并转为数值型 DF1[c("Var1", "Var2")] <- lapply(DF1[c("Var1", "Var2")], function(x) as.numeric(ifelse(x == "NA", NA, x))) DF2[c("Var1", "Var2")] <- lapply(DF2[c("Var1", "Var2")], function(x) as.numeric(ifelse(x == "NA", NA, x)))
步骤2:执行条件替换
使用mapply遍历数值列,仅在DF1单元格为NA且DF2对应位置为0时替换:
# 创建结果DataFrame result <- DF1 # 对Var1和Var2执行替换逻辑 result[c("Var1", "Var2")] <- mapply(function(col_df1, col_df2) { ifelse(is.na(col_df1) & !is.na(col_df2) & col_df2 == 0, 0, col_df1) }, result[c("Var1", "Var2")], DF2[c("Var1", "Var2")])
用dplyr的简洁实现(需先安装dplyr包)
如果你习惯使用tidyverse语法,也可以用dplyr::across一次性处理所有数值列:
library(dplyr) result <- DF1 %>% # 先转换数据类型 mutate(across(c(Var1, Var2), ~ as.numeric(.)), # 执行条件替换 across(c(Var1, Var2), ~ ifelse(is.na(.) & DF2[[cur_column()]] == 0, 0, .)))
最终输出
运行上述代码后,result的输出与你期望的一致:
| ID | Var1 | Var2 |
|---|---|---|
| A | 0 | 45.5 |
| B | 20 | NA |
| C | NA | 14.5 |
| D | 0 | NA |
| E | 9 | 0 |
内容的提问来源于stack exchange,提问作者user20330606
相关产品推荐
相关产品推荐

