R语言:将tibble逻辑列TRUE/FALSE转为1/0的实现疑问
问题原因与解决方法
概念误区
你用isTRUE(useMFH)的问题在于:isTRUE()是用来判断单个逻辑值的函数,当传入一个逻辑向量(也就是你的useMFH列)时,它只会检查整个向量是否为长度1的TRUE值。而你的tibble列是多元素的向量,所以isTRUE(useMFH)永远返回FALSE,导致case_when里第一个条件从未触发,所有行都走TRUE ~ 0的默认分支,最终zz全为0。
正确实现方法
有几种简单的方式可以实现需求:
方法1:直接转换逻辑型为数值型
R里逻辑值本身可以直接转为数值,TRUE对应1,FALSE对应0,用as.integer()或者+号强制转换即可:
df2 <- df %>% mutate(zz = as.integer(useMFH)) # 或者更简洁的写法 df2 <- df %>% mutate(zz = +useMFH)
方法2:正确使用case_when
去掉isTRUE(),直接用向量本身作为条件,case_when会对向量的每个元素逐一判断:
df2 <- df %>% mutate(zz = case_when(useMFH ~ 1, TRUE ~ 0))
方法3:基础R的ifelse函数
如果习惯用基础R的函数,ifelse()也可以实现向量级别的判断:
df2 <- df %>% mutate(zz = ifelse(useMFH, 1, 0))
内容的提问来源于stack exchange,提问作者Wade Schuette
相关产品推荐
相关产品推荐

