如何在R语言中判断字符串是否以指定词干开头并返回匹配词干
解决方法
可以借助tidyverse工具包中的stringr和purrr实现需求,以下提供两种实用方案:
方案1:构造统一正则模式(简洁高效)
将词干列表转换为匹配字符串开头的正则表达式,用str_extract()直接提取匹配的词干:
library(tidyverse) stems <- c("fri", "odd", "inspi") dat <- tibble(complete_word = c("fright", "todd", "quirky", "oddly")) # 拼接正则模式:^表示匹配字符串开头,|分隔多个候选词干 stem_pattern <- str_c("^(", str_c(stems, collapse = "|"), ")") dat <- dat %>% mutate(stem = str_extract(complete_word, stem_pattern)) # 查看结果 dat
运行后输出符合预期:
# A tibble: 4 × 2 complete_word stem <chr> <chr> 1 fright fri 2 todd NA 3 quirky NA 4 oddly odd
方案2:逐词干匹配(逻辑灵活)
通过map_chr()遍历每个单词,用str_starts()检查是否匹配词干列表中的项,返回首个匹配的词干或NA:
library(tidyverse) stems <- c("fri", "odd", "inspi") dat <- tibble(complete_word = c("fright", "todd", "quirky", "oddly")) dat <- dat %>% mutate(stem = map_chr(complete_word, ~{ # 筛选出当前单词开头匹配的词干 matched <- stems[str_starts(.x, stems)] # 有匹配则返回词干,否则返回NA if (length(matched) > 0) matched else NA_character_ })) # 查看结果 dat
关于str_starts()的使用误区
直接给str_starts()传入词干列表时,它会返回一个逻辑矩阵(每行对应一个单词,每列对应一个词干的匹配结果),而非直接返回匹配的词干。上面两种方案分别通过正则整合或筛选逻辑,解决了这个问题,最终得到你需要的结果。
内容的提问来源于stack exchange,提问作者Adam_G
相关产品推荐
相关产品推荐

