如何在dplyr管道中生成词数的频率统计汇总(适配bigrquery)
解决方案:用dplyr管道实现词数频率统计(含BigQuery适配)
针对你的需求,我们可以通过完整的dplyr管道实现从文本列到指定词数范围(0到6)的频率统计,同时兼容本地数据和BigQuery查询场景。
本地数据场景(示例数据测试)
先基于你提供的示例数据,用dplyr+stringr完成统计:
library(dplyr) library(stringr) # 示例数据 tf1 <- tibble( row = 1:5, body = c("tt t ttt j ss oe", "kpw eero", "pow eir sap r", "s", "oe") ) # 核心管道代码 word_freq_result <- tf1 %>% # 1. 计算每行的词数:按空格分割后取长度,空文本会返回0 mutate(n_words = str_split(body, "\\s+") %>% map_int(length)) %>% # 2. 统计每个词数的出现频率 count(n_words, name = "freq") %>% # 3. 关联完整的词数序列(0到6),确保所有目标词数都被包含 right_join(tibble(n_words = 0:6), by = "n_words") %>% # 4. 将未出现的词数频率替换为0 mutate(freq = replace_na(freq, 0)) %>% # 5. 按词数排序,匹配期望结果的顺序 arrange(n_words) # 输出结果 word_freq_result
运行后会得到你期望的结果:
# A tibble: 7 × 2 n_words freq <int> <int> 1 0 0 2 1 2 3 2 1 4 3 0 5 4 1 6 5 0 7 6 1
步骤解释:
- 词数计算:用
str_split按空格分割文本,map_int(length)提取每个分割结果的长度,精准得到每行的词数;如果遇到空文本,会自动返回0,符合需求。 - 频率统计:
count()函数直接统计每个词数的出现次数,重命名为freq。 - 补全词数序列:通过
right_join关联我们预设的0-6词数序列,确保没有出现的词数也能被纳入结果。 - NA替换:用
replace_na()把未匹配到的词数频率从NA转为0,贴合统计要求。 - 排序:
arrange()确保结果按词数从小到大排列,和预期输出一致。
BigQuery场景适配
如果是通过bigrquery在云端查询,需要用BigQuery兼容的SQL函数替换本地字符串处理逻辑,核心管道调整如下:
library(dplyr) library(bigrquery) # 假设已建立BigQuery连接(con为连接对象) # tf1 <- tbl(con, "your_dataset.your_target_table") bq_word_freq_result <- tf1 %>% # 1. BigQuery用REGEXP_COUNT统计词数:匹配非空白字符的次数 mutate(n_words = REGEXP_COUNT(body, r"(\S+)")) %>% # 2. 统计频率 count(n_words, name = "freq") %>% # 3. 在BigQuery端生成0-6的词数序列(更高效) right_join( tbl(con, sql("SELECT n_words FROM UNNEST(GENERATE_ARRAY(0, 6)) AS n_words")), by = "n_words" ) %>% # 4. BigQuery用IFNULL替换NA为0 mutate(freq = IFNULL(freq, 0)) %>% # 5. 排序并拉取结果到本地 arrange(n_words) %>% collect()
关键适配点:
- 词数计算用BigQuery的
REGEXP_COUNT函数,\\S+匹配连续非空白字符,直接统计词数,比分割后取长度更高效。 - 词数序列直接在BigQuery端用
GENERATE_ARRAY生成,避免本地数据传输,提升查询效率。 - 用BigQuery的
IFNULL函数替换NA,符合云端SQL的语法规范。
内容的提问来源于stack exchange,提问作者Neal Barsch
相关产品推荐
相关产品推荐

