R语言匹配特定字符替换报错:为BT后缀数值添加负号失败
问题:给后缀为BT的字符串添加负号并转换为数值失败
我尝试对后缀为"BT"的字符进行处理,为其添加负号并提取数字,但代码执行失败。
原代码
df <- data.frame( exposure = c("123BT", "113BB", "116BB", "117BT") ) df %>% mutate( exposure2 = case_when(exposure == regmatches("d+\BT") ~ paste0("-", exposure), TRUE ~ exposure) )
报错信息
Error: Problem with `mutate()` column `exposure2`. i `exposure2 = case_when(...)`. x argument "m" is missing, with no default Run `rlang::last_error()` to see where the error occurred.
预期输出
df <- data.frame( exposure = c("123BT", "113BB", "116BB", "117BT"), exposure2 = c(-123, 113, 116, -117) )
错误原因分析
regmatches用法错误:regmatches需要搭配regexpr/gregexpr先完成匹配,不能直接传入正则字符串;同时正则表达式写法有误,应该使用"\\d+BT$"来匹配以BT结尾的数字字符串。- 条件判断逻辑错误:
case_when里用exposure == regmatches(...)完全不符合匹配逻辑,应该先判断字符串是否符合正则规则。 - 结果类型不符合预期:原代码仅拼接负号字符串,没有转换为数值类型,无法得到预期的数值结果。
解决方案
使用tidyverse工具包的字符串处理函数,先提取数字、再根据后缀判断正负,最终得到数值类型结果:
简洁写法
library(tidyverse) df <- data.frame( exposure = c("123BT", "113BB", "116BB", "117BT") ) df %>% mutate( exposure2 = as.numeric(str_extract(exposure, "\\d+")) * if_else(str_detect(exposure, "BT$"), -1, 1) )
分步写法(更清晰)
library(tidyverse) df <- data.frame( exposure = c("123BT", "113BB", "116BB", "117BT") ) df %>% mutate( # 提取字符串中的数字部分并转为数值 num_value = as.numeric(str_extract(exposure, "\\d+")), # 根据是否以BT结尾设置正负 exposure2 = if_else(str_detect(exposure, "BT$"), -num_value, num_value), # 移除中间辅助列 .keep = "unused" )
代码说明
str_extract(exposure, "\\d+"):从字符串中提取连续的数字部分。str_detect(exposure, "BT$"):判断字符串是否以BT结尾($表示匹配字符串末尾,避免误匹配中间含BT的情况)。if_else(...):根据判断结果对数字乘以-1或1,得到预期的正负数值。
内容的提问来源于stack exchange,提问作者Joko Ade Nursiyono
相关产品推荐
相关产品推荐

