Сравните все элементы вектора со всеми элементами списка без цикла for

Это то, что я пытаюсь сделать

List <- list(LETTERS,LETTERS,LETTERS)
Vector <- c("A","B","C","D")

Я хочу знать, присутствует ли каждый элемент вектора в каждом элементе списка или нет. Я пробовал mapply, но он сравнивает только соответствующие элементы. Я хочу все комбинации.

 mapply(function(x,y){x %in% y},Vector,List)

A    B    C    D 
TRUE TRUE TRUE TRUE 

С mapply вывод выглядит следующим образом. Я хочу получить что-то вроде этого

[,1]  [,2]  [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
[4,] TRUE TRUE TRUE

Есть в любом случае, чтобы сделать это без использования вложенного цикла for?? Также попробовал функцию outer() но это не работает.

1 ответ

Решение

Возможно, одно из следующего - это больше, чем вы ищете:

sapply(List, function(x) Vector %in% x)
mapply(function(x, y) {x %in% y}, list(Vector), List)
vapply(List, function(x) Vector %in% x, logical(length(Vector)))

Все результаты в:

#      [,1] [,2] [,3]
# [1,] TRUE TRUE TRUE
# [2,] TRUE TRUE TRUE
# [3,] TRUE TRUE TRUE
# [4,] TRUE TRUE TRUE

Я предпочитаю третий вариант, так как vapply Позволяет вам конкретно указать форму ожидаемого вывода (здесь логический вектор такой же длины, что и вход "Вектор"). Это делает его более эффективным, чем sapply который проверяет, можно ли упростить значения до массива (используя метко simplify2array функция).

Другие вопросы по тегам