计算两个向量的匹配元素,但不包括计数中的重复元素

时间:2014-11-14 18:59:06

标签: r performance optimization pattern-matching match

我在这个论坛上搜索了很多。但是,我没有发现与我面临的问题类似的问题。

我的问题是:
我有两个向量
x <- c(1,1,2,2,3,3,3,4,4,4,6,7,8)z <- c(1,1,2,4,5,5,5)

我需要计算 x z 相互出现的次数,包括是否重复。

此问题的答案应为 4 ,因为:
两个编号1 一个编号2 一个每个载体中的数字

匹配()等功能无法提供帮助,因为它们会返回非重复数字的重复答案。使用 unique()也会将最终答案从 4 更改为 3

我想出的是一个循环,每当它在另一个中找到一个数字时,它会从列表中删除,因此不会再次计算。
循环适用于此示例的此大小;但是,多次搜索较大的向量会使我的循环效率低下,而且对于我的目的而言太慢。

system.time({
    for(n in 1:1000){
        x <- c(1,1,2,2,3,3,3,4,4,4,6,7,8)
        z <- c(1,1,2,4,5,5,5)
        score <- 0
        for(s in spectrum){
            if(s %in% sequence){
                sequence <- sequence[-which(sequence==s)[1]]
                score <- score + 1
            }
        }
    }
})

有人可以建议更好的方法吗? 我试过使用lapply,对于短矢量它更快,但对于较长的矢量它变慢了..

1 个答案:

答案 0 :(得分:4)

在此处使用R的矢量化。没有必要循环。

您可以使用table来查看频率,

table(z[z %in% x])
# 
# 1 2 4 
# 2 1 1 

然后将表格的sum作为总数

sum(table(z[z %in% x]))
# [1] 4