如何使用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
相关产品推荐
相关产品推荐

