大型数据库中预定义搜索字符串,统计每行字符串及变体频率
大型数据库字符串变体频率统计解决方案
我需要针对大型数据库实现一个统计方案:预先定义待搜索的字符串,生成统计表格,计算每行中这些字符串及其变体的出现频率。
示例数据
strings <- c("dog", "cat", "mouse") var1 <- c("black dog", "white dog", "angry dog", "dogs and cats are nice", "dog") var2 <- c("white cat", "black cat", "tiny cat", NA, "cow") var3 <- c("little mouse", "big mouse", NA, NA, "mouse") data <- data.frame(var1, var2, var3)
预期输出
当搜索dog、cat和mouse时,预期输出如下:
dog&cat 4 mouse 3
解决方案
实现思路
- 覆盖字符串变体:用正则匹配目标字符串及常见变体(如复数形式),确保匹配完整单词,避免误判。
- 逐行匹配统计:对每行数据忽略空值后,检查是否存在目标组合,最终汇总每行匹配的次数。
- 适配大型数据:使用向量化操作替代循环,提升处理效率。
代码实现
library(stringr) library(dplyr) # 定义搜索组合及其变体匹配正则 search_groups <- list( "dog&cat" = regex("\\b(dog|dogs|cat|cats)\\b", ignore_case = TRUE), "mouse" = regex("\\b(mouse|mice)\\b", ignore_case = TRUE) ) # 检查单行是否匹配目标组合 check_row_matches <- function(row_data) { cleaned_row <- na.omit(row_data) sapply(search_groups, function(pattern) any(str_detect(cleaned_row, pattern))) } # 统计每行匹配情况并汇总 total_counts <- data %>% rowwise() %>% do(data.frame(t(check_row_matches(c(.$var1, .$var2, .$var3))))) %>% colSums() # 输出结果 for (i in seq_along(total_counts)) { cat(names(total_counts)[i], total_counts[i], "\n") }
代码说明
search_groups:为每个统计组合定义正则,\\b确保匹配独立单词,避免部分匹配(如dog不会匹配doggy),同时包含复数等变体。check_row_matches:清理单行的空值后,判断该行是否存在对应组合的匹配项。- 通过
rowwise()逐行处理数据,colSums()汇总所有行的匹配次数,最终输出预期格式的结果。
内容的提问来源于stack exchange,提问作者onlyjust17
相关产品推荐
相关产品推荐

