【问题标题】:counting matching elements of two vectors but not including repeated elements in the count计算两个向量的匹配元素,但不包括计数中的重复元素
【发布时间】:2015-01-12 06:14:26
【问题描述】:

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

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

我需要计算 xz 彼此出现的次数,包括它们是否重复。

这个问题的答案应该是4,因为:
两个数字1一个数字2一个每个向量中的数字 4

ma​​tch() 之类的函数无济于事,因为它们会为不重复的数字返回重复的答案。使用 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,对于短向量它更快,但对于较长的向量它变得更慢..

【问题讨论】:

    标签: r performance optimization pattern-matching match


    【解决方案1】:

    在这里使用 R 的矢量化来发挥您的优势。不需要循环。

    您可以使用table 查看频率,

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

    然后取表的sum为总数

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

    【讨论】:

    • 嗨,理查德,您的版本确实非常简单。但是,正常的 for 循环仍然效率高出 20%...prntscr.com/56gufh 我仍在寻找结果更快的东西...也许我将不得不简化其他代码中的内容...跨度>
    • 似乎由于某种原因,单独的代码运行速度较慢;但是,在函数内部,您的代码比循环快 25%。
    • 有意思,你用的矢量有多大?
    • 我在 Coursera 上做 this exercise。请参阅extra dataset。其中一个向量那么大,另一个向量从 1 开始,大小约为 20。起初我的代码会很快。但是,它会开始减慢到需要将近 10 分钟才能完成的程度。现在在您的帮助下,大约需要 2 分钟。 :D
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多