You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:37:46