【发布时间】: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)
我需要计算 x 或 z 彼此出现的次数,包括它们是否重复。
这个问题的答案应该是4,因为:
有两个数字1,一个数字2和一个每个向量中的数字 4。
match() 之类的函数无济于事,因为它们会为不重复的数字返回重复的答案。使用 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