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

如何向量化stringr::str_count的pattern参数以正确统计匹配次数?

问题:向量化stringr::str_count时计数结果不符合预期

原代码尝试向量化stringr::str_count的pattern参数,统计指定子串在目标字符串中的出现次数,但实际结果与预期不符:

library(stringr)

# Define the patterns you want to count
patterns <- c("apple", "banana", "orange")

# Create a vectorized version of str_count
vectorized_str_count <- Vectorize(str_count, vectorize.args = "pattern")

# Input string
string <- "I like apples, bananas, and oranges. Apples are my favorite."

# Count the occurrences of patterns in the string
counts <- vectorized_str_count(string, pattern = patterns)

# Print the counts
print(counts)

预期输出为2, 1, 1,但实际返回1, 1, 1——核心原因是str_count默认区分大小写,原字符串中首字母大写的Apples无法被小写的apple模式匹配,且apples(复数)包含apple子串,仅被统计1次。


调整方案(无需构造正则)

方法1:修改向量化函数,添加忽略大小写参数

直接在Vectorize包装的逻辑中指定ignore.case = TRUE,让匹配不区分大小写:

library(stringr)

patterns <- c("apple", "banana", "orange")
string <- "I like apples, bananas, and oranges. Apples are my favorite."

# 向量化时嵌入忽略大小写的匹配逻辑
vectorized_str_count <- Vectorize(function(str, pat) {
  str_count(str, pattern = pat, ignore.case = TRUE)
}, vectorize.args = "pat")

counts <- vectorized_str_count(string, pat = patterns)
print(counts)
# 输出:apple banana orange 
#          2      1      1 

方法2:用purrr包实现更简洁的向量化(推荐)

Vectorize本质是循环语法糖,用purrr::map_int可更直观地遍历模式并统计:

library(stringr)
library(purrr)

patterns <- c("apple", "banana", "orange")
string <- "I like apples, bananas, and oranges. Apples are my favorite."

counts <- map_int(patterns, ~str_count(string, pattern = .x, ignore.case = TRUE))
names(counts) <- patterns
print(counts)
# 输出:apple banana orange 
#          2      1      1 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:22