R语言根据三列NA值条件创建Status新列的实操问题
问题原因
- 逻辑判断语法错误
is.na(df$brackish & df$freshwater)不符合预期逻辑。R中&运算的规则为:只要任意一个操作数是NA,运算结果就返回NA,因此只要Brackish或Freshwater任意一列为NA,is.na()判断就会返回TRUE,而非“两列均为NA”才成立,这是行被错标为Marine_Only的核心原因。 - 匹配顺序错误
case_when采用从上到下的优先匹配规则,第一个满足的条件会直接返回结果。代码中将覆盖范围最广的判断放在首位,后续条件完全没有触发机会。 - 列引用不规范
dplyr管道操作中直接使用列名即可,不需要添加df$前缀,否则会引用原始数据集而非管道内的临时计算数据,可能引发取值错误。 - 列名大小写不匹配
R对大小写敏感,规则中的列名为首字母大写的Brackish、Freshwater,代码中使用小写会导致取值失败。 - 缺少规则对应判断
原代码的条件完全没有匹配你给出的Status对应规则,且未覆盖到Marine列的逻辑校验。
修正代码
按照你给出的四行规则,调整条件顺序和判断逻辑后的实现如下:
library(dplyr) df <- df %>% mutate(Status = case_when( # 三列均为非NA !is.na(Brackish) & !is.na(Freshwater) & !is.na(Marine) ~ "Marine_Estuarine_Freshwater", # 仅Freshwater为NA !is.na(Brackish) & is.na(Freshwater) & !is.na(Marine) ~ "Marine_Estuarine", # 仅Brackish为NA is.na(Brackish) & !is.na(Freshwater) & !is.na(Marine) ~ "Marine_Freshwater", # Brackish、Freshwater均为NA is.na(Brackish) & is.na(Freshwater) & !is.na(Marine) ~ "Marine_Only" ))
如果你的数据集默认所有行的Marine列都为有效值,可删除每个条件中的!is.na(Marine)判断。
内容的提问来源于stack exchange,提问作者Cyph
相关产品推荐
相关产品推荐

