Виберіть кілька елементів зі списку


83

У мене є список у R довжиною близько 10000 елементів. Скажімо, я хочу вибрати лише елементи, 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 () і містить ('деякий текст ")?
Залишено

3
@HermanToothrot Ти ні. Принаймні не безпосередньо. Можна надрукувати або застосувати над індексами, які потрібно витягти, та ітеративно схопити відповідний елемент [[. Але якщо ви хочете витягти кілька елементів, тоді ви дійсно захоплюєте підсписок, і вам слід просто використовувати[
Dason
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.