library(data.table)
dat1 <- data.table(id1 = c(1, 1, 2),
          pattern = c("apple", "applejack", "bananas, sweet"))
dat2 <- data.table(id2 = c(1174, 1231),
          description = c("apple is sweet", "apple is a computer"),
          memo = c("bananas, sweet yes", "bananas, sweetyes"))
> dat1
   id1        pattern
1:   1          apple
2:   1      applejack
3:   2 bananas, sweet
> dat2
    id2         description               memo
1: 1174      apple is sweet bananas, sweet yes
2: 1231 apple is a computer  bananas, sweetyes

我有两张data.table的,dat1dat2.我想根据dat2中的descriptionmemo列搜索dat2中的每个pattern,并存储相应的id2.

最终的输出表应该如下所示:

   id1        pattern description_match memo_match
1:   1          apple         1174,1231       <NA>
2:   1      applejack              <NA>       <NA>
3:   2 bananas, sweet              <NA>       1174

我想使用的正则表达式是\\b[pattern]\\b.以下是我的try :

dat1[, description_match := dat2[grepl(paste0("\\b", dat1$pattern, "\\b"), dat2$description), .(id2 = paste(id2, collapse = ","))]]
dat1[, memo_match := dat2[grepl(paste0("\\b", dat1$pattern, "\\b"), dat2$memo), .(id2 = paste(id2, collapse = ","))]]

然而,两者都给了我一个错误,即grepl只能使用前pattern.

推荐答案

我们按行顺序分组,通过从grepl的逻辑输出中提取paste个‘id2’来创建来自‘dat2’的匹配列

library(data.table)
dat1[, c("description_match", "memo_match") := {
    pat <- sprintf('\\b(%s)\\b', paste(pattern, collapse = "|"))
    .(toString(dat2$id2[grepl(pat, dat2$description)]), 
    toString(dat2$id2[grepl(pat, dat2$memo)]))
   }, seq_along(id1)]
dplyr::na_if(dat1, "")
    id1        pattern description_match memo_match
   <num>         <char>            <char>     <char>
1:     1          apple        1174, 1231       <NA>
2:     1      applejack              <NA>       <NA>
3:     2 bananas, sweet              <NA>       1174

根据?sprintf

字符串fmt包含传递到输出字符串的普通字符,以及对通过...提供的参数进行操作的转换规范.允许的转换规范以%开始,以集合aAdifeEgGosxX%中的一个字母结束

S-字符串.字符Na被转换为"na".


或者使用for循环

for(nm in names(dat2)[-1]) 
   dat1[, paste0(nm, "_match") :=  
     toString(dat2$id2[grepl(paste0("\\b", pattern, "\\b"), 
       dat2[[nm]])]), seq_along(id1)][]

R相关问答推荐

了解.groups的目的= dØr的摘要功能中的删除

IQR()和stats之间四分位距计算的差异::分位数()在R和' ggpubr '

如果行和列名以相同的开头,将矩阵值设置为0

如何求解arg必须为NULL或deSolve包的ode函数中的字符向量错误

名称输出pmap on tible

在不安装软件包的情况下测试更新

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

使用across,starts_with和ifelse语句变更多个变量

使用外部文件分配变量名及其值

可以替代与NSE一起使用的‘any_of()’吗?

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

随机森林的带Shap值的蜂群图

观察器中的inaliateLater的位置

`-`是否也用于数据帧,有时使用引用调用?

数据集上的R循环和存储模型系数

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

具有自定义仓位限制和计数的GGPLATE直方图

通过比较来自多个数据框的值和R中的条件来添加新列

把代码写成dplyr中的group_by/摘要更简洁吗?