R中两个子列表的交集大小

时间:2018-09-18 16:23:32

标签: r

如果已经提出要求,请提前道歉。我无法提供一个描述性的搜索字词。

我有以下列表:

list(
c('apples', 'bananas', 'pears'),
c('dragons'),
c('strawberries'),
c('apples','bananas','strawberries')
)

我正在寻找一个函数f,该函数将返回具有项X和项Y的元素份额。

例如:我知道,每当我的列表元素使用“香蕉”一词时,它也使用“苹果”一词;即f('bananas', 'apples') = 1。类似地,f('strawberries','apples') = 0.5因为有两个带有“草莓”的列表元素,但是只有其中一个具有“香蕉”。再举一个例子,我希望f('apples','strawberries')返回0.5,因为我有2个带有“苹果”的元素,其中一个也有“草莓”。

我意识到我可以用2个循环来做到这一点,在第一遍中,我将创建templist1,其中包含所有包含f()第一个参数的元素,在第二步中,我将创建templist2将包含templist1的所有元素,其中包含f()的第二个参数。我的答案就是length(templist2)/length(templist1)。我正在寻找向量化的实现。

欢迎任何指针。谢谢! :)

1 个答案:

答案 0 :(得分:2)

怎么样

x<-list(
  c('apples', 'bananas', 'pears'),
  c('dragons'),
  c('strawberries'),
  c('apples','bananas','strawberries')
)

get_f <- function(x) {
  function(a, b) {
    hasfirst <- sapply(x, `%in%`, x=a)
    hasfirstandsecond <- sapply(x[hasfirst], `%in%`, x=b)
    sum(hasfirstandsecond)/sum(hasfirst)
  }
}

那你就可以做

f <- get_f(x)
f('bananas', 'apples')
# [1] 1
f('strawberries','apples')
# [1] 0.5
f('apples','strawberries')
# [1] 0.5