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

如何使用mutate()匹配字符串开头的Left/Right并过滤其他内容?

匹配字符串开头关键词的解决方案

数据集情况

假设我们有个叫data的数据集,里面有个string列,数据定义如下:

library(tidyverse)

data$string <- c("Left A", "Left Middle A", "Middle A", "Right Middle A", "Right A",
                 "Left B", "Left Middle B", "Middle B", "Right Middle B", "Right B")

需求

要给每条记录打标记:只有第一个词是"Left"或者"Right"的,标记成"Out",其他的标记成"In",但原代码错误地把所有包含这两个词的记录都标成了"Out",需要修正。

原代码问题

原代码误用了gsub函数(该函数用于字符串替换而非匹配检测),且未限定仅匹配字符串开头的关键词,导致逻辑错误:

data1 <- data %>%
  mutate(Location = ifelse(gsub("\\bLeft\\b", string) | gsub("\\bRight\\b", string),
                           "Out",
                           "In"))

正确代码

使用str_detect()配合正则表达式的开头锚定符^,可以精准匹配字符串开头的关键词,代码如下:

data1 <- data %>%
  mutate(Location = ifelse(str_detect(string, "^(Left|Right)\\b"), 
                           "Out", 
                           "In"))

代码说明

  • ^:正则表达式的开头锚定符,强制从字符串的起始位置匹配,确保只检测第一个词。
  • (Left|Right):表示匹配"Left"或"Right"任意一个完整词。
  • \\b:单词边界,避免误匹配类似"Lefty"这种以Left开头但不是完整单词的情况(如果不需要严格匹配完整单词,可去掉该符号)。
  • str_detect():tidyverse中的字符串检测函数,返回布尔值(TRUE/FALSE),刚好适配ifelse()的判断逻辑。

运行后得到的结果符合预期:第一个词为Left/Right的记录标记为"Out",其余标记为"In"。


内容的提问来源于stack exchange,提问作者ksinva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:36