如何在R中基于含NA的两列创建符合规则的新列?
在R中按规则创建新列并处理NA值
核心解决方案(以常见等级规则为例,可根据你的附图规则调整)
以下用dplyr包的case_when函数实现,该函数能清晰处理多条件逻辑,同时自然兼容NA值:
- 先加载依赖包(未安装则先执行
install.packages("dplyr")):
library(dplyr)
- 假设你的数据集名为
df,根据规则生成新列(以下规则为示例,需替换为附图中的实际规则):
df <- df %>% mutate( new_column = case_when( # 规则1:左右均为"高" amplevel_r == "高" & amplevel_l == "高" ~ 2, # 规则2:左右均为"低" amplevel_r == "低" & amplevel_l == "低" ~ 0, # 规则3:右高左低 amplevel_r == "高" & amplevel_l == "低" ~ 1, # 规则4:右低左高 amplevel_r == "低" & amplevel_l == "高" ~ -1, # 所有未匹配情况(含任意一列NA)返回NA TRUE ~ NA_real_ # 若新列是字符型,改用NA_character_ ) )
针对你遇到的问题分析
- 第一段代码报错+NA处理失败:通常是因为未考虑NA值的特殊性——在R中,NA与任何值比较都会返回NA,导致条件判断无法匹配。
case_when的最后一个TRUE ~ NA_real_会统一处理所有未匹配的情况,包括NA。 - 第二段代码新列全为1:大概率是条件逻辑错误,比如误将
&(同时满足)写成|(任一满足),或者条件范围写得过大,导致所有行都匹配到返回1的规则。检查你的条件表达式,确保每个规则的逻辑精准对应附图要求。
Base R替代方案(无需dplyr)
如果不想用dplyr,可嵌套ifelse实现:
df$new_column <- with(df, ifelse(amplevel_r == "高" & amplevel_l == "高", 2, ifelse(amplevel_r == "低" & amplevel_l == "低", 0, ifelse(amplevel_r == "高" & amplevel_l == "低", 1, ifelse(amplevel_r == "低" & amplevel_l == "高", -1, NA) ) ) ) )
注意事项
- 如果
amplevel_r和amplevel_l是数值型而非字符型,只需将比较条件改成数值判断(比如amplevel_r >= 3)即可。 - 若附图规则有其他特殊情况(比如NA需映射为特定值而非NA),只需在
case_when中添加对应条件(比如is.na(amplevel_r) | is.na(amplevel_l) ~ "缺失")。
内容的提问来源于stack exchange,提问作者Mufti Mushfiqur Rahman
相关产品推荐
相关产品推荐

