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

如何在R中按数据框变量分组进行文本词频统计?

按分组实现文本高频词统计(R语言)

问题背景

我在R中有一个数据框,需要对其中的Message列做基础文本分析,此前已能完成单组的词频统计,但现在需要按Pad.Name分组执行分析,输出每个分组的高频词(如前10个)及对应计数。

样本数据

dat <- structure(list(Pad.Name = c("MISSOURI W", "MISSOURI W", "MISSOURI W", 
"LEE", "LEE", "LEE"), Message = c("pump maint", "PUMP MAINT", "Pump Maintenance", 
"waiting on wireline", 
"seating the ball", "Waiting on wireline")), row.names = 11:16, class = "data.frame")

尝试过的方法

我尝试使用quanteda包的corpus_group和corpus函数,设置docid_field = dat$Pad.Name和text_field = dat$Message,但未成功得到分组统计结果。

期望输出

每个Pad.Name对应的高频词及计数,示例如下:

output <- data.frame(Pad.Name = c("MISSOURI W", "MISSOURI W", "LEE", "LEE"), 
                     Word = c("pump", "maint", "waiting", "wireline"), 
                     Count = c(3,2,2,2))

解决方案

方法1:使用quanteda包

正确流程是先创建包含分组变量的语料库,分组后生成词频矩阵,最终整理为目标格式:

library(quanteda)
library(tidyr)
library(dplyr)

# 创建语料库,保留Pad.Name作为文档变量
corp <- corpus(dat, text_field = "Message", docvars = dat["Pad.Name"])

# 按Pad.Name分组语料库
corp_grouped <- corpus_group(corp, groups = Pad.Name)

# 分词并预处理(小写、移除停用词)
toks <- tokens(corp_grouped, remove_punct = TRUE) %>%
  tokens_tolower() %>%
  tokens_remove(stopwords("english"))  # 移除英文停用词(如on/the等)

# 生成文档-词频矩阵并转换为数据框
dfm <- dfm(toks)
result <- convert(dfm, to = "data.frame") %>%
  pivot_longer(cols = -document, names_to = "Word", values_to = "Count") %>%
  rename(Pad.Name = document) %>%
  filter(Count > 0) %>%
  group_by(Pad.Name) %>%
  arrange(desc(Count), .by_group = TRUE) %>%
  slice_head(n = 10) %>%  # 提取前10个高频词
  ungroup()

print(result)

方法2:使用tidytext包(tidyverse风格)

如果习惯tidyverse工作流,tidytext的实现更简洁直观:

library(tidytext)
library(dplyr)
library(tidyr)

dat %>%
  # 将文本拆分为单个词
  unnest_tokens(input = Message, output = Word) %>%
  # 移除英文停用词
  anti_join(stop_words, by = "Word") %>%
  # 按分组和词统计频次
  group_by(Pad.Name, Word) %>%
  summarise(Count = n(), .groups = "drop") %>%
  # 按分组排序并提取前10个高频词
  group_by(Pad.Name) %>%
  arrange(desc(Count), .by_group = TRUE) %>%
  slice_head(n = 10)

说明

之前的错误在于corpus函数参数使用不当:docid_field是指定数据框中作为文档ID的列名,而非直接传入向量。正确做法是将分组变量作为文档变量(docvars)传入语料库,再用corpus_group完成分组。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56