Сравните все элементы вектора со всеми элементами списка без цикла 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
функция).