r - 一个更通用的函数,用于列表的n个元素中的匹配元素数

标签 r

我正在尝试计算列表元素之间的常见条目数:

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/

相关文章:

r - 向 GGPLOT2 直方图添加点

r - 条件Rcpp中的NA值

R:从列表中计算mean()

r - R 中的连接矩阵

r - 公里内最低海拔

R - 如何将这个嵌套的 for 循环转换为可以改变列表的 lapply 函数

r - 如何从R社区的角度打造最好的交互式R语言在线学习平台?

r - 如何更改效果包图中的字体类型

r - 使用不存在的列名对数据框进行子集

r - 在数据框的开头插入列