如果有两个表单列表
list_a <- list(c(1,2,3,4,5), c(6,7,8,9,10), c(11,12,13,14))
list_b <- list(c(1,9,3,7,5), c(2,7,13,9,10), c(1,12,5,14))
我想比较 list_a
中的元素与列表 list_b
中的元素并提取匹配元素的总和。我的意思是,我想比较如下
sum(c(1,2,3,4,5) %in% c(1,9,3,7,5))
sum(c(1,2,3,4,5) %in% c(2,7,13,9,10))
sum(c(1,2,3,4,5) %in% c(1,12,5,14))
sum(c(6,7,8,9,10) %in% c(1,9,3,7,5))
sum(c(6,7,8,9,10) %in% c(2,7,13,9,10))
sum(c(6,7,8,9,10) %in% c(1,12,5,14))
sum(c(11,12,13,14) %in% c(1,9,3,7,5))
sum(c(11,12,13,14) %in% c(2,7,13,9,10))
sum(c(11,12,13,14) %in% c(1,12,5,14))
我使用 sapply()
函数尝试了以下代码,输出符合预期(列映射到 list_a
中的元素,行映射到 list_b
中的元素)。但是,当列表的长度很大时,此代码太慢(想象一下 list_a
有 10000 个元素,list_b
有 10000 个元素)。
test <- sapply(list_a, function(x){
out_sum <- sapply(list_b, function(y){
matches <- sum(x %in% y)
return(matches)
})
return(out_sum)
})
输出
有人有想法吗?
答案 0 :(得分:1)
您可以尝试使用 map
函数。它减少了一半以上的运行时间。
library(purrr)
out_sum <- list_b %>% map(function (y) {
list_a %>% map(function(x) sum(x %in% y))
})
out_matrix <- matrix(unlist(out_sum), ncol = length(list_a), byrow = TRUE)
答案 1 :(得分:1)
另一种选择是使用 outer
-
check <- function(x, y) sum(list_a[[x]] %in% list_b[[y]])
test <- outer(seq_along(list_a), seq_along(list_b), Vectorize(check))