Я пытаюсь вычислить количество общих записей среди элементов списка:
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
.
Я чувствую, что есть очень элегантное решение, но я просто не вижу его.