【问题标题】:Fast grep with a vectored pattern or match, to return list of all matches带有矢量模式或匹配的快速 grep,返回所有匹配的列表
【发布时间】:2014-07-15 15:36:27
【问题描述】:

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

我正在尝试避免循环,因此我正在尝试对过程进行矢量化: 我需要做类似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 长度相同的向量,并且值是 first 匹配,而我需要所有这些。

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

有什么建议吗?

【问题讨论】:

  • 也许is.element(COUNTRIES_Origin, COUNTRIES_Target) ?
  • 你想要的输出是什么?您的循环代码每次都简单地重新分配 var_pointer 。这没有多大意义。
  • @MrFlick 是的......我的错,现在它是一个列表。
  • 尝试向量化 MxN 匹配从根本上说性能不是很好,无论你怎么做,它仍然是 MN 操作。使用 哈希 代替 O(1) 查找。

标签: r vectorization


【解决方案1】:

尝试对 MxN 匹配进行矢量化从根本上说性能不是很好,无论您如何做,它仍然是 MN 操作。

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

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

【讨论】:

    【解决方案2】:

    您似乎可以在列表中只使用lapply 而不是loop

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

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

    【讨论】:

    • 唉,这并没有产生预期的性能改进,因为它只是隐藏了 lapply 中的循环。
    • @Elad663 你的真实数据有这么多冗余吗?像这样的解决方案怎么样:ids <- split(1:length(COUNTRIES_Target), COUNTRIES_Target); ml <- ids[COUNTRIES_Origin]。这首先折叠目标列表。使查找更快,但产生相同的结果。
    • 刚刚和split一起玩过,看起来很有前途!将在早上发送适当的回复。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多