Размер пересечения двух подсписков в R - PullRequest
0 голосов
/ 18 сентября 2018

Заранее извиняюсь, если об этом уже спрашивали.Я не смог придумать описательный поисковый термин.

У меня есть следующий список:

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, потому что есть 2 элемента списка с «клубникой», но только у 1 из них также есть «бананы».Чтобы привести еще один пример, я ожидал бы, что f('apples','strawberries') вернет 0,5, так как у меня есть 2 элемента с «яблоками», и у одного из них также есть «клубника».

Я понимаю, что мог бы сделать это с 2циклы, где на первом проходе я бы создал templist1, который имеет все элементы, которые содержат первый аргумент f (), а на втором шаге я бы создал templist2, который будет содержать все элементы templist1, которые содержат второй аргументиз f ().Тогда мой ответ будет просто length(templist2)/length(templist1).Я ищу векторизованную реализацию.

Любые указатели приветствуются.Спасибо!:)

1 Ответ

0 голосов
/ 18 сентября 2018

Как насчет этого

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...