首页 > 解决方案 > 匹配子字符串和其他变量

问题描述

我正在尝试合并两个关于键值和字符串模式的数据集。基本上,我想要一个函数来计算子字符串匹配出现的次数,条件是其他关键变量在两个数据库中匹配。

跨两个数据集,基础和合并,当变量k1k2匹配并且merge$str2包含在base$str我想要一个函数来计算一个匹配时。具体来说,我希望整个单词匹配整个单词(例如,“BB”不匹配“BBB”,就好像第一个被写成广告“\bBB\b”)。我有数百万个数据集要合并,所以效率是最重要的。

我有一个可能的解决方案,但我不确定在非常大的数据集中是最好的。

base <- data.frame(k1=rep(1,4),
                   k2=c(rep(1,3),2),
                   str=c("AA BBB","BB CCC","CCC","CCC")) 

merge <- data.frame(k1=rep(1,2),
                   k2=rep(1,2),
                   str2=c("BB","CCC")) 


library(stringr)
library(dplyr)
library(tidyr)

base %>% 
  left_join(merge) %>% 
  mutate(match=stringi::stri_detect_regex(str, paste0("\\b",str2,"\\b")),
         match=replace_na(ifelse(match==T,1,0),0)) %>% 
  group_by(k1,k2,str) %>% 
  summarise(matches=sum(match))


desired_result <- data.frame(k1=rep(1,4),
                    k2=c(rep(1,3),2),
                    str=c("AA BBB","BB CCC","CCC","CCC"),
                    match=c(0,2,1,0)) 

标签: rdplyrtidyversestringrstringi

解决方案


每次效率都是一个问题,data.table 值得考虑..也许这可以帮助你..

library(data.table)
m <- merge(as.data.table(base), 
      as.data.table(merge),
      by = c("k1", "k2"),
      all = TRUE, 
      allow.cartesian=TRUE)
m[, i := grepl(paste0("\\b", str2,"\\b", sep = ""), str), by = 1:nrow(m)]
m[, .(match = sum(i, na.rm = TRUE)), by = c("k1","k2", "str")]

推荐阅读