【问题标题】:Efficiently match elements of character vectors高效匹配字符向量的元素
【发布时间】:2015-07-10 21:52:53
【问题描述】:

我有一个有点复杂的字符向量元素之间的匹配情况。 我有一个查询向量,例如:

query.vec <- c("a","b","c","d","k")

和一个搜索向量,例如:

search.vec <- c("a","b,b1","c,d","e","f")

我想获取搜索向量中查询向量中每个元素的外观索引。 查询向量和搜索向量中的元素是唯一的,这意味着每个查询向量元素只有一个可能的匹配项(或者在 query.vec[5] 的情况下根本没有匹配项)。但是,查询向量中的多个元素可以匹配搜索向量中的相同元素(例如,query.vec[3]query.vec[4] 匹配 search.vec[3])。

由于搜索向量包含逗号分隔字符,这些字符仍然算作我的目的匹配(查询向量中的元素与搜索向量中逗号分隔字符元素之一的匹配),因此复杂性增加。这就是为什么一个简单的match 不会很有效的原因。

我想到了:

unlist(sapply(query.vec, function(x) {
  idx <- which(grepl(x, search.vec) == TRUE)
  if(length(idx) == 0) idx <- NA
  return(idx)
}))

给出正确答案:

 a  b  c  d  k 
 1  2  3  3 NA 

但由于实际上我的查询向量的长度约为 8000,而搜索向量的长度约为 250,000,因此该解决方案非常慢。所以我正在寻找更快的东西。

【问题讨论】:

  • 你试过strsplit吗?
  • 不,因为我认为它比我的解决方案还要慢。
  • 由于性能对您很重要,因此最好澄清一些极端情况:如果query.vec 的元素在search.vec 中多次出现该怎么办,或者可以假设永远不会发生?
  • x &lt;- strsplit(search.vec, "");tbl &lt;- table(x); tbl[match(names(tbl), query.vec)] 。或者类似的东西

标签: r match


【解决方案1】:

我发现这就足够了:

query.vec <- c("a","b","c","d","k")
search.vec <- c("a","b,b1","c,d","e","f")

split.search.vec.list = strsplit(search.vec, ",")
split.search.vec = unlist(split.search.vec.list)
names(split.search.vec) = unlist(sapply(1:length(split.search.vec.list), function(x) rep(x, length(split.search.vec.list[[x]]))))
idx = match(query.vec, split.search.vec)
idx[which(!is.na(idx))] = names(split.search.vec)[idx[which(!is.na(idx))]]
idx = as.integer(idx)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2021-01-09
    • 2021-10-18
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多