R语言在If/Then语句中使用NA判断创建Egg_Number列
问题说明
需要在数据集NIUS2021.ALL中新增名为Egg_Number的列,判定规则如下:
- 每行对应1个独立鸟巢,该行无NA值时代表巢内有3枚卵
- 仅
length_3字段为NA时代表巢内有2枚卵 length_3与length_2字段同时为NA时代表巢内仅有1枚卵
原编写的if/else代码存在几处语法和逻辑错误:
- R中判断空值不能使用
=或==,必须使用is.na()函数 - R中向量化逻辑与运算符为
&,不是AND - 原生
if/else仅支持单值判断,无法直接对整列数据逐行批量处理 - 最后分支列名拼写错误,误写为
NIUS2021$.ALLEgg_Number - 判断顺序错误:若先判断
length_3为NA,会把length_2、length_3同时为NA的1枚卵场景误判为2枚卵
正确代码实现
基础R方案
无需加载额外包,直接使用向量化的ifelse()嵌套实现,注意严格按照从特殊到一般的顺序写判断条件:
NIUS2021.ALL$Egg_Number <- ifelse( is.na(NIUS2021.ALL$length_3) & is.na(NIUS2021.ALL$length_2), 1, ifelse(is.na(NIUS2021.ALL$length_3), 2, 3) )
tidyverse/dplyr方案
代码可读性更强,适合日常数据处理工作流:
library(dplyr) NIUS2021.ALL <- NIUS2021.ALL %>% mutate( Egg_Number = case_when( is.na(length_3) & is.na(length_2) ~ 1, is.na(length_3) ~ 2, TRUE ~ 3 ) )
结果验证
针对提供的前6行样例数据,第5行length_3为NA、length_2有有效值,计算得到Egg_Number为2;其余5行length_3均有有效值,Egg_Number为3,完全符合规则要求。
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

