【问题标题】:R data.table select rows based on partial string match from character vectorR data.table 根据字符向量中的部分字符串匹配选择行
【发布时间】:2020-05-08 15:37:26
【问题描述】:

我有一个字符向量和一个 data.tabe:

library(data.table)
pselection <- c("12345" , "2345", "12345678")
dt <- data.table("title"=c("First title", "Second Title", "Third Title", "Fourth Title"), 
                 "sha"=c("12345", "2345; 66543; 33423", "22222; 12345678;", "666662345; 444"))

现在我想根据; 分隔符选择部分匹配sha 列的data.table 的所有行。所以基本上我想要这个输出:

          title                sha
1:  First title              12345
2: Second Title 2345; 66543; 33423
3:  Third Title   22222; 12345678;

我该怎么做?

我试过了:

selected <- dt[sha %in% pselection]

但它只选择完全匹配并且使用%like% 表达式只是为了匹配一个不多的表达式。连接到正则表达式(如paste(pselection, collapse="|"))是不可能的,因为我的选择是> 10.000。提前感谢您的帮助!

【问题讨论】:

  • 您需要使用 data.table 还是只是在寻找选择部分字符串匹配的解决方案?
  • 使用 data.table 会很好,但任何足够有效的解决方案都值得赞赏!

标签: r data.table


【解决方案1】:

我有一个使用lapplytstrsplit 的解决方案。可能更优雅,但它可以完成工作

lapply(1:nrow(dt), function(i) {
  dt[i,'match' := any(trimws(tstrsplit(as.character(dt[i,'sha']),";")) %in% pselection)]
  })

dt[(match)]
          title                sha match
1:  First title              12345  TRUE
2: Second Title 2345; 66543; 33423  TRUE
3:  Third Title   22222; 12345678;  TRUE

想法是拆分sha 列的每一行(修剪空白,否则第3 行将不匹配)并检查是否出现任何sha

【讨论】:

    【解决方案2】:

    使用regex

    pselection <- paste0("\\b", pselection) # \b is boundary and includes ; and whitespace
    dt[grepl(paste(pselection, collapse = "|"), sha)]
    
              title                sha
    1:  First title              12345
    2: Second Title 2345; 66543; 33423
    3:  Third Title   22222; 12345678;
    

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 2021-09-08
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多