如何在DataFrame中统计多个部分字符串匹配(每行仅计数一次)
解决多作者字符串匹配计数问题(每行仅计一次)
我明白你的需求啦——要统计DataFrame的Text列中每个作者出现的次数,而且不管单元格里同一个作者名出现多少次,每行只算1次。之前用sum(str_count())只能单个处理,这里给你几个简单高效的方法:
首先先把你的示例数据整理成可运行的R代码,方便后续测试:
authors <- c("Edward","Kelly","Simon") df <- data.frame( Text = c( "Edward was the king of ...", "Kelly has ..", "Last year Simon..", "Did you know Edward.." ), Date = c(2011, 2014, 2009, 1999) )
方法1:Base R 原生实现
用sapply遍历每个作者,结合grepl判断每行是否包含该作者(存在即记1),最后求和:
# 计算每个作者的计数 author_counts <- sapply(authors, function(name) { # grepl返回逻辑向量,sum自动将TRUE转为1,FALSE转为0 sum(grepl(name, df$Text, fixed = TRUE)) }) # 转成你想要的表格格式 result <- as.data.frame(author_counts) %>% tibble::rownames_to_column("Author") %>% dplyr::rename(Count = author_counts) print(result)
方法2:Tidyverse 风格实现
如果你习惯用tidyverse工具链,用purrr::map_dbl可以更简洁地完成:
library(tidyverse) result <- tibble(Author = authors) %>% mutate(Count = map_dbl(Author, ~sum(grepl(.x, df$Text, fixed = TRUE)))) print(result)
关键细节说明
- 为什么不用
str_count?因为str_count会统计每个单元格内作者名出现的次数(比如某行写了两次"Edward"会算2),而我们需要的是每行只要存在就记1,grepl正好能判断存在性,完美匹配需求。 - 参数
fixed = TRUE很重要:它会让grepl做精确的字符串匹配,避免作者名里的特殊字符(比如.、*)被当作正则表达式符号处理,防止错误匹配。
运行上述代码后,你会得到期望的输出:
Author Count 1 Edward 2 2 Kelly 1 3 Simon 1
内容的提问来源于stack exchange,提问作者Bastje
相关产品推荐
相关产品推荐

