我想这是微不足道的,我道歉,我找不到怎么做。
我试图戒掉一个循环,所以我试图对这个过程进行矢量化:
我需要执行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
有什么建议吗?
答案 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?