如果我理解正确,你可以查看crossprod
和stack
:
crossprod(table(stack(l)))
你可以按照以下方式扩展这个想法,以获得只包含相关值的
data.frame
:
编写一个漂亮的函数
listIntersect <- function(inList) {
X <- crossprod(table(stack(inList)))
X[lower.tri(X)] <- NA
diag(X) <- NA
out <- na.omit(data.frame(as.table(X)))
out[order(out$ind), ]
}
应用它
listIntersect(l)
性能似乎相当不错。
扩展列表
:
L <- unlist(replicate(100, l, FALSE), recursive=FALSE)
names(L) <- make.unique(names(L))
设置一些函数进行测试:
fun1 <- function(l) listIntersect(l)
fun2 <- function(l) apply( combn( l , 2 ) , 2 , function(x) length( intersect( unlist( x[1]) , unlist(x[2]) ) ) )
fun3 <- function(l) {
m1 <- combn(names(l),2)
val <- sapply(split(m1, col(m1)),function(x) {x1 <- l[[x[1]]]; x2 <- l[[x[2]]]; length(intersect(x1, x2))})
Ind <- apply(m1,2,paste,collapse="int")
data.frame(Ind, val, stringsAsFactors=F)
}
看看时间安排:
system.time(F1 <- fun1(L))
system.time(F2 <- fun2(L))
system.time(F3 <- fun3(L))
每个人似乎都在以不同的方式排序结果,但数字匹配:
table(F1$Freq)
table(F2)
table(F3$val)