Выберите несколько элементов из списка


83

У меня есть список в R длиной около 10 000 элементов. Скажем, я хочу выбрать только элементы 5, 7 и 9. Я не уверен, как бы это сделать без цикла for.

Я хочу сделать что-то подобное, mylist[[c(5,7,9]]но это не работает. Я также пробовал эту lapplyфункцию, но не смог заставить ее работать.


19
Из документации по адресу ?"[[": Наиболее важное различие между [, [[и $в том , что [можно выбрать более одного элемента , тогда как два других выбрать один элемент.
A5C1D2H2I1M1N2O1R2T1

1
В дополнение к комментарию @mrdwab, это векторизованный мир R, «отдельный элемент» может быть вектором!
seancarmody

Ответы:


139

mylist[c(5,7,9)] должен это сделать.

Вы хотите, чтобы подсписки возвращались как подсписки списка результатов; вы не используете [[]](или, скорее, функция [[) для этого - как Дейсон упоминает в комментариях, [[захватывает элемент.


8
Просто чтобы добавить больше деталей - «[» вернет подсписок, поэтому имеет смысл использовать с ним несколько входов. «[[» фактически захватит сам элемент, так что он может принимать только один ввод, поскольку он не возвращает список (если сам элемент не является списком).
Дейсон

Это векторизовано? У меня два списка: bсодержит 10 миллионов элементов. filter_binsэто список, в котором каждый элемент является индексом. поэтому, чтобы получать только элементы bс одним и тем же индексом, у меня lapply(filter_bins, function(x) b[x, ]) так b [x,] возвращает только подмножество строк (где каждый элемент выбирается filter_bins) .. Я надеюсь, что это имеет смысл. Мой вопрос в том, что это очень медленно
masfenix

@masfenix, вы должны создать новый вопрос с описанием деталей.
Glen_b

Можно ли выполнить указанное выше решение с помощью чего-то вроде dplyr :: select () и contains ('some text')?
Заброшенный

3
@HermanToothrot Нет. По крайней мере, не напрямую. Вы можете lapply или sapply по индексам, которые хотите извлечь, и итеративно захватить соответствующий элемент [[. Но если вы хотите извлечь несколько элементов, то на самом деле вы [
берете подсписок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.