这是我的意思的示例,此代码输出正确的内容:
list1 = list(c(1,2,3,4), c(5,6,7), c(8,9), c(10, 11))
matrix1 = rbind(c(1,2), c(1,5), c(8, 10))
compare <- function(list.t, matrix.t) {
pairs <- 0
for (i in 1:nrow(matrix.t)) {
for (j in 1:length(list.t)) {
if (length(intersect(matrix.t[i,], list.t[[j]])) == 2) {
pairs <- pairs + 1
}
}
}
return(pairs / nrow(matrix.t))
}
compare(list1, matrix1)
# = 0.33333
我希望这是有道理的。我正在尝试使用nx2矩阵,看看是否在列表的每个部分中也都找到了矩阵每一行的两个元素。因此,在上面的示例中,矩阵的第一行是(1,2),并且该对在列表的第一部分中找到。在列表的任何部分都找不到(1,5)或(8,10)对。这就是为什么我要输出0.3333(1/3)。
我想知道是否有人知道一种不使用两个for循环将每一行与每个部分进行比较的方法?我有更大的矩阵和列表,所以这太慢了。
感谢您的任何帮助!
这项工作不一样吗?您可以调用sapply
列表并同时与矩阵的所有行进行比较。
> list1 = list(c(1,2,3,4), c(5,6,7), c(8,9), c(10, 11))
> matrix1 = rbind(c(1,2), c(1,5), c(8, 10))
> s <- sapply(seq_along(list1), function(i){
length(intersect(list1[[i]], matrix1)) == 2
})
> sum(s)/nrow(matrix1)
# [1] 0.3333333
如果我们调用您的函数f1()
,并且该函数的该sapply
版本与此相同f2()
,则我们得到以下速度差异。
> library(microbenchmark)
> microbenchmark(f1(), f2())
# Unit: microseconds
# expr min lq median uq max neval
# f1() 245.017 261.2240 268.843 281.7350 1265.706 100
# f2() 113.727 117.7045 125.478 135.6945 268.310 100
希望这就是您要寻找的效率提高。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句