【发布时间】: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 <- strsplit(search.vec, "");tbl <- table(x); tbl[match(names(tbl), query.vec)]。或者类似的东西