我正在尝试计算列表元素之间的常见条目数:
temp<-list(element1=c("a","b","c"), element2=c("b","c","d"),
element3=c("d","e","f"), element4=c("a","c","z"))
要获得元素的所有成对组合之间的重叠,此函数起作用:
calculate.overlap.2<-function(y){
pw<-combn(y,2,FUN=function(x)sum(x[[1]]%in%x[[2]]))
names(pw)<-combn(y,2,FUN=function(x)paste(names(x)[[1]],names(x)[[2]],sep="-"))
return(pw)
}
要获得元素的所有三向组合之间的重叠,可以使用以下函数:
calculate.overlap.3<-function(y){
pw<-combn(y,3,FUN=function(x)sum(x[[1]]%in%x[[2]]&x[[1]]%in%x[[3]]))
names(pw)<-combn(y,3,FUN=function(x) paste(names(x)[[1]],names(x)[[2]],names(x)[[3]],sep="-"))
return(pw)
}
但是从函数内部的数字可以看出,这不是一个很好的解决方案。
将这两个函数归纳为一个,并让每个重叠检查中的元素作为输入,将是一个很好的选择。也就是说,
number.of.elements.per.comparison=2
的输入将与上面的calculate.overlap.2
等效,并且number.of.elements.per.comparison=3
的功能输入将与calculate.overlap.3
相同。我觉得有一个非常优雅的解决方案,但是我看不到它。
最佳答案
calculate.overlap <- function(y, i){
pw <- combn(seq_along(y), i, FUN= function(x) {
res <- length(Reduce(intersect, y[x]))
names(res) <- paste(names(y[x]), collapse = "-")
res
}, simplify = FALSE)
do.call(c, pw)
}
calculate.overlap(temp, 3)
#element1-element2-element3 element1-element2-element4 element1-element3-element4 element2-element3-element4
# 0 1 0 0
关于r - 一个更通用的函数,用于列表的n个元素中的匹配元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30433608/