为何使用case_when时出现‘NAs introduced by coercion’警告?
问题原因解析
case_when的运行逻辑是先把所有分支右侧的表达式全计算一遍,再根据条件挑选对应结果,不是满足某个条件就跳过其他分支的计算。哪怕你的第一个条件已经匹配了所有行,as.numeric(session)还是会对整个session列执行转换——把字符串"a"转成数值肯定会失败,自然就触发了NAs introduced by coercion警告。
解决方案
方法1:改用ifelse
ifelse是逐行判断的,只有不满足条件的行才会执行后面的转换操作,不会触发警告:
df %>% mutate(sessionNum = ifelse(session == "a", 1, as.numeric(session)))
方法2:优化case_when分支
给第二个分支加上明确的过滤条件,只对非"a"的行执行转换:
df %>% mutate(sessionNum = case_when( session == "a" ~ 1, session != "a" ~ as.numeric(session) ))
如果需要更严谨,还可以先判断内容是否为纯数字再转换,避免其他非数字字符串引发的问题:
library(stringr) df %>% mutate(sessionNum = case_when( session == "a" ~ 1, str_detect(session, "^\\d+$") ~ as.numeric(session) ))
内容的提问来源于stack exchange,提问作者Alex Holcombe
相关产品推荐
相关产品推荐

