在dplyr的mutate()中实现多次str_replace无需中间变量的方法
实现代码
直接在mutate()内结合if_else()/case_when()和嵌套的字符处理函数即可,无需创建中间变量:
library(tidyverse) # 示例数据 x <- c("A", "B", "C", "D") y <- c("<0.5", "~1", "<10", "~30") # 一步处理生成数值列 df <- data.frame(x,y) %>% mutate(y_num = if_else( str_detect(y, "<"), # 含<的取值:先删~再删<,转数值后减半 as.numeric(str_remove(str_remove(y, "~"), "<")) / 2, # 不含<的取值:仅删除~后直接转数值 as.numeric(str_remove(y, "~")) ))
处理逻辑说明
- 所有取值统一先删除
~符号,通过嵌套str_remove()(功能等价于str_replace(xxx, "~", ""))即可完成,不需要单独存储中间变量 - 用
str_detect()区分是否包含<符号,仅对匹配到的取值做减半处理,避免全局处理导致的逻辑错误和NA问题 - 最终生成的
y_num列为纯数值类型,结果为0.25, 1, 5, 30完全符合要求
如果后续需要扩展更多字符处理规则,可以替换为case_when()写法,可读性更高:
df <- data.frame(x,y) %>% mutate(y_num = case_when( str_detect(y, "<") ~ as.numeric(str_remove(str_remove(y, "~"), "<")) / 2, TRUE ~ as.numeric(str_remove(y, "~")) ))
内容的提问来源于stack exchange,提问作者tm95
相关产品推荐
相关产品推荐

