Как извлечь / поместить подмножество элемента из списка с помощью трубы magrittr %>%?

С момента введения %>% оператор в magrittr пакет (и его использование в dplyr), Я начал использовать это в своей работе.

Однако одна простая операция поставила меня в тупик. В частности, это извлечение (или подмножество) элементов из списка.

Пример: в базе R I использовал бы $, [ или же [[ чтобы извлечь элемент из списка:

iris$Species
iris[["Species"]]

Я могу добиться того же, используя %>% трубы:

iris %>%
  subset(select = "Species") %>%
  head

  Species
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa

Или же

iris %>%
  `[[`("Species") %>%
  levels

[1] "setosa"     "versicolor" "virginica" 

Тем не менее, это похоже на грязное, неуклюжее решение.

Есть ли более элегантный, канонический способ извлечь элемент из списка, используя %>% труба?

Примечание: я не хочу никакого решения, связанного с dplyr По той простой причине, что я хочу, чтобы решение работало с любым объектом R, включая списки и матрицы, а не только фреймы данных.

2 ответа

Решение

В версии 1.5 magrittr на CRAN вы можете использовать %$% оператор:

iris %$% 
  Species %>%
  levels

По сути это обертка вокруг with но приятнее чем

iris %>% 
  with(Species %>% levels)

или же

iris %>%
  with(Species) %>%
  levels

Он предназначен для удобства, когда функции не имеют своего собственного аргумента данных, например, с графиком, который вы можете сделать

iris %>% 
  plot(Sepal.Length ~ Sepal.Width, data = .)

но например с ts.plot Вы не можете сделать это, так что теперь:

iris %$%
  ts.plot(Sepal.Length)

[да, я знаю, что пример не имеет смысла, но он иллюстрирует суть]

Обратите внимание, что [<- а также [[<- также есть псевдонимы, inset а также inset2..

Использование use_series, extract2 а также extract за $, [[, [соответственно.

?extract

magrittr предоставляет серию псевдонимов, которые могут быть более приятными для использования при создании цепочек с использованием %>% оператор ".

Для вашего примера вы можете попробовать

iris %>%
  extract("Species")

а также

iris %>%
  extract2("Species") %>%
  levels

Смотрите в нижней части этой страницы для получения дополнительной информации: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

Более свежий tidyverse решение: pluck() от purrr (начиная с 0.2.3) извлекает именованный элемент из списка (или именованный столбец из фрейма данных):

library(tidyverse)

iris %>% 
  pluck("Species")

Примечание: для доступа к элементу по номеру индекса вы также можете использовать first(), last() или же nth() от dplyr для любого объекта (список, фрейм данных, матрица), чтобы извлечь его первый, последний или n-й элемент:

iris %>% 
  as.list() %>%  # unnecessary, just to show it works on lists too
  last()         # or nth(5) in this case, to get Species
Другие вопросы по тегам