Как извлечь / поместить подмножество элемента из списка с помощью трубы 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