有效匹配字符向量的元素

时间:2015-07-10 21:52:54

标签: r match

我在角色向量元素之间匹配有点复杂。 我有一个查询向量,例如:

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这个解决方案非常慢。所以我正在寻找更快的东西。

1 个答案:

答案 0 :(得分: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)