r - 匹配子字符串和其他变量
问题描述
我正在尝试合并两个关于键值和字符串模式的数据集。基本上,我想要一个函数来计算子字符串匹配出现的次数,条件是其他关键变量在两个数据库中匹配。
跨两个数据集,基础和合并,当变量k1
和k2
匹配并且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))
解决方案
每次效率都是一个问题,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")]
推荐阅读
- command-line - 如何划分命令行参数?
- c - 在 C 中实现快速排序的分段错误
- reactjs - 为什么 React Component 渲染两次
- python - 根据 matplotlib 中的分类变量更改颜色
- c - C编译器错误,或者我在这里缺少什么?
- javascript - 从随机生成的 firebase 数据库子同步对象更改
- mysql - Mysql query takes too much time with Index
- perl - 如何在简单程序中计算变量以在 perl 脚本中使用?
- python - 一旦达到目标,如何使我的递归算法停止?
- python - np.linalg.norm 以及如何处理机器 epsilon