如何在R的mutate链式操作中提取字符串倒数第二分隔部分?
在R的dplyr链式操作中提取字符串倒数第二部分的解决方案
我明白你想要在dplyr的链式操作里轻松提取status字段中用'-'分隔的倒数第二部分——就像SQL里split_part(status, '-', -2)那样方便对吧?之前的尝试没成功是因为str_split_fixed返回的是矩阵,不能直接用[[-2]]来逐行取元素,给你几个简单好用的解决方案:
首先咱们先准备好示例数据:
library(dplyr) library(stringr) library(purrr) df <- tibble( status = c( "file-status-done-bad", "file-status-maybe-good", "file-status-underreview-good", "file-status-complete-final-bad" ) )
方法一:拆分后取倒数第二个元素
用str_split把每个字符串拆成字符向量的列表,再用map_chr逐个提取每个列表里的倒数第二个元素:
result <- df %>% mutate(status_extract = map_chr(str_split(status, "-"), ~ .x[length(.x) - 1])) print(result)
这个方法逻辑很直观:str_split(status, "-")会把每个status拆成比如c("file", "status", "done", "bad")这样的向量,length(.x)-1就指向倒数第二个位置,map_chr把结果整理成字符向量,刚好适合mutate的列操作。
方法二:用正则表达式直接匹配(更简洁)
如果不想处理列表,直接用str_extract配合正则表达式精准匹配倒数第二部分:
result <- df %>% mutate(status_extract = str_extract(status, "(?<=-)\\w+(?=-\\w+$)")) print(result)
正则的意思拆解一下:
(?<=-):正向预查,确保匹配的内容前面是一个'-'\\w+:匹配我们要的字母/数字/下划线组成的部分(?=-\\w+$):正向预查,确保匹配的内容后面跟着一个'-'和最后一个单词(直到字符串结尾)
这样就能直接定位到倒数第二部分,不用拆分整个字符串,效率也更高。
验证结果
两种方法都会得到你想要的输出:
# A tibble: 4 × 2 status status_extract <chr> <chr> 1 file-status-done-bad done 2 file-status-maybe-good maybe 3 file-status-underreview-good underreview 4 file-status-complete-final-bad final
内容的提问来源于stack exchange,提问作者PDog
相关产品推荐
相关产品推荐

