R语言使用str_detect判断列值含%时赋值unit列却全列生效如何修复
问题原因
你写的代码出错的核心原因是if语句在判断长度大于1的逻辑向量时,只会读取第一个元素的布尔值:stringr::str_detect(df$variable, "%")会返回和数据框行数等长的逻辑向量,只要第一行的variable列包含%,后续的整列赋值语句就会执行,导致所有行的unit都被改写为%。运行原有代码时R通常会抛出「条件长度大于1,仅使用第一个元素」的警告,你可以核对下运行日志。
修复方案
你需要用向量化操作代替单分支if判断,仅对符合条件的行做赋值,这里提供两种常用写法:
- 基础R向量化赋值
# 仅对variable列包含%的行改写unit值,不影响其他行的unit原值 df$unit[stringr::str_detect(df$variable, "%")] <- "%"
- dplyr管道流程写法(适合整合到数据处理链路中)
library(dplyr) library(stringr) df <- df %>% mutate(unit = if_else(str_detect(variable, "%"), "%", unit))
内容的提问来源于stack exchange,提问作者AutumnWest
相关产品推荐
相关产品推荐

