如何向量化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
相关产品推荐
相关产品推荐

