如果已经提出要求,请提前道歉。我无法提供一个描述性的搜索字词。
我有以下列表:
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)
。我正在寻找向量化的实现。
欢迎任何指针。谢谢! :)
答案 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