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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:23:43