R语言使用case_when时缺失值为何被转换为字符串"NA"?
问题原因
你的代码核心错误来自两处:
paste0()函数的特性:该函数处理NA值时,会将其强制转换为字符串"NA",而非保留R原生的逻辑缺失值。你当前场景下ID和ID_new本身就是字符型变量,完全不需要额外用paste0()包裹变量,属于多余操作引入的问题。case_when的逻辑覆盖不全:当原ID为NA、同时匹配到的ID_new也为NA时,你没有额外处理这种场景的缺失值保留逻辑,最终生成的是字符串形式的"NA",不是R能识别的缺失值,因此sum(is.na(df_new$ID))返回0。
解决方法
方案1:修正原有case_when写法
去掉多余的paste0()包裹即可,直接返回变量本身就能保留原生缺失值:
df_new <- left_join( df, new_vals, by = "animal" ) %>% mutate( ID = case_when( is.na(ID) ~ ID_new, TRUE ~ ID ) )
方案2:更简洁的coalesce()实现
dplyr内置的coalesce()函数就是专门用于缺失值替换的工具,会依次返回输入向量中第一个非缺失值,完美适配你“原ID缺失就用ID_new补,ID_new也缺失就保留缺失”的需求,代码更简洁且不会出现字符串转换问题:
df_new <- left_join( df, new_vals, by = "animal" ) %>% mutate(ID = coalesce(ID, ID_new))
以上两种方案执行后,sum(is.na(df_new$ID))都会返回正确的缺失值计数2。
内容的提问来源于stack exchange,提问作者icedcoffee
相关产品推荐
相关产品推荐

