Предположим, у меня есть два списка в R: длинный и более короткий, например:
list1 = list(571,572,573,574,561,562,563,564,595,570,571,573)
list2 = list(c(571,564,565,600))
Обратите внимание, что числа не возрастают, они могут встречаться более одного раза и находятся на разном расстоянии друг от друга.
Теперь я хотел бы проверить каждый элемент списка1, является ли он также элементом списка2. Если это так, я бы хотел, чтобы результат был ИСТИНА, если не ЛОЖЬ. Итак, по сути, я хочу получить список длиной list1, содержащий TRUE и FALSE.
Я не знаю, как справиться с этой проблемой... Может быть, с помощью цикла for или lapply? На самом деле списки намного длиннее: около 30 000 строк для списка list1 и 1000 для списка list2.
Есть ли у вас какие-либо предложения?
еще есть list1 %in% unlist(list2) . Однако не уверен, безопасно ли это для реального варианта использования.
Я также подозреваю, что в фактических данных ОП может даже не быть list(c(...)), а вместо этого list(...)





Вы можете использовать функцию lapply, чтобы итеративно проверить, принадлежит ли каждый элемент списка1 списку2:
lapply(list1, function(x){x %in% list2[[1]]})
Это вернет вывод в виде списка. Если вы хотите, чтобы вместо этого он возвращал вектор, вы можете использовать sapply:
sapply(list1, function(x){x %in% list2[[1]]})
Для каждого элемента в списке 1 это все равно будет проходить через все элементы в списке 2, поэтому это может быть медленным. Более быстрая альтернатива — использовать хеширование для хранения элементов списка list2 в хеш-таблице, а затем выполнять проверку членства за постоянное время. Один из способов сделать это в R — использовать пакет r2r:
library(r2r)
m <- hashset()
for (i in list2[[1]]){insert(m, i)}
lapply(list1, function(x){has_key(m, x)})
Да, решения с помощью lapply/sapply — это именно то, что я искал. Спасибо за предложение с хеш-таблицей. Для меня это совершенно ново, но очень многообещающе!
list1 %in% list2[[1]]?