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

R语言中统计数据框内指定词表词汇出现次数的问题

解决R语言词表词汇频次统计的循环问题

嘿,我完全懂你碰到的糟心状况——本来想用for循环给词表里每个词统计在数据框里的出现次数,结果搞成每一行都塞满了所有词汇的频次,这肯定是循环里的赋值逻辑没抓对行的对应关系!

先说说你可能踩的坑

大概率是你在循环时没有针对当前词对应的行去赋值,而是直接把整个频次列覆盖,或者错误地把每个词的结果都加到了所有行里。举个例子,如果你的代码是类似这样的:

word_list$count <- 0
for (word in word_list$word) {
  count <- sum(grepl(word, df$text))
  word_list$count <- count  # 这里错了!每次都把整个列设成当前词的计数
}

那最后所有行都会变成最后一个词的频次;要是你不小心在循环里用了cbind新增列,就会导致每行都有所有词的频次数据,完全偏离预期。

修正后的for循环写法

如果你还是想用for循环,只要针对每个词的索引来对应行赋值就好。假设你的词表是word_list(有一列target_word存要统计的词),数据框df里的文本列是content:

# 先初始化频次列
word_list$occurrence <- NA_integer_

# 按索引循环,确保每个词的计数对应到自己的行
for (i in 1:nrow(word_list)) {
  current_word <- word_list$target_word[i]
  # 统计该词在所有文本中的出现次数,\\b是匹配完整单词(避免部分匹配)
  current_count <- sum(grepl(paste0("\\b", current_word, "\\b"), df$content, ignore.case = FALSE))
  # 赋值给当前行的频次列
  word_list$occurrence[i] <- current_count
}

更高效的R风格写法(推荐)

R里尽量少用for循环,用向量化操作不仅代码更简洁,速度也更快。这里给你两种常用的方案:

方案1:用dplyr的行操作

library(dplyr)

word_list <- word_list %>%
  rowwise() %>%  # 按行处理每个词
  mutate(occurrence = sum(grepl(paste0("\\b", target_word, "\\b"), df$content))) %>%
  ungroup()  # 取消行分组

方案2:用purrr的map函数

library(purrr)
library(stringr)  # 如果用str_count更精准统计每个单元格内的词频

# 用str_count统计每个单元格中该词的出现次数,再求和(比grepl更适合统计重复出现的情况)
word_list$occurrence <- map_int(word_list$target_word, ~sum(str_count(df$content, fixed(.x))))

几个细节提示

  • 如果不需要匹配完整单词(比如允许“cat”匹配“catty”),去掉paste0("\\b", ..., "\\b")即可。
  • 要忽略大小写的话,给grepl或str_count加上ignore.case = TRUE参数。
  • 如果你的文本数据是多列,记得先把它们合并成一列再统计,或者调整代码遍历所有文本列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:08:51