带有矢量模式或匹配的快速grep,返回所有匹配的列表

时间:2014-05-26 20:27:21

标签: r grep vectorization

我想这是微不足道的,我道歉,我找不到怎么做。

我试图戒掉一个循环,所以我试图对这个过程进行矢量化: 我需要执行grep之类的操作,但pattern是一个向量。另一个选项是match,其中value不仅是第一个位置。

例如数据(不是真实数据的方式,其他方面我会利用它的结构):

COUNTRIES=c("Austria","Belgium","Denmark","France","Germany",
"Ireland","Italy","Luxembourg","Netherlands",
"Portugal","Sweden","Spain","Finland","United Kingdom")

COUNTRIES_Target=rep(COUNTRIES,times=4066)
COUNTRIES_Origin=rep(COUNTRIES,each=4066)

现在,我得到了一个循环:

var_pointer=list()
for (i in 1:length(COUNTRIES_Origin))
{     
var_pointer[[i]]=which(COUNTRIES_Origin[i]==COUNTRIES_Target)
 }

match的问题是match(x=COUNTRIES_Origin,table=COUNTRIES_Target)返回与COUNTRIES_Origin长度相同的向量,值为第一个匹配,而我需要全部他们。

grep的问题是grep(pattern=COUNTRIES_Origin,x=COUNTRIES_Target)是给定的警告: Warning message: In grep(pattern = COUNTRIES_Origin, x = COUNTRIES_Target) : argument 'pattern' has length > 1 and only the first element will be used

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您似乎只能lapply而不是loop

lapply(COUNTRIES_Origin, function(x) which(COUNTRIES_Target==x))

我在这里使用哪个,因为grep似乎更适合部分匹配,并且您正在寻找完全匹配。

答案 1 :(得分:0)

尝试向量化MxN匹配从根本上说并不是非常高效,无论你怎么做,它仍然是MN操作。

使用 哈希 代替O(1)查找。

有关使用hash包的建议,请参阅Can I use a list as a hash in R? If so, why is it so slow?