web-dev-qa-db-fra.com

Comment extraire / sous-ensemble un élément d'une liste avec le magrittr%>% pipe?

Depuis l'introduction du %>% dans le package magrittr (et son utilisation dans dplyr), j'ai commencé à l'utiliser dans mon propre travail.

Une opération simple m'a cependant déconcerté. Plus précisément, il s'agit de l'extraction (ou du sous-ensemble) d'éléments d'une liste.

Un exemple: dans la base R, j'utiliserais $, [ ou [[ pour extraire un élément d'une liste:

iris$Species
iris[["Species"]]

Je peux obtenir le même résultat en utilisant le %>% pipe:

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

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

Ou

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

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

Cependant, cela ressemble à une solution désordonnée et maladroite.

Existe-t-il un moyen plus élégant et canonique d'extraire un élément d'une liste en utilisant le %>% pipe?

Remarque: Je ne veux aucune solution impliquant dplyr, pour la simple raison que je veux que la solution fonctionne avec n'importe quel objet R, y compris les listes et les matrices, pas seulement les trames de données.

31
Andrie

Dans la version 1.5 de magrittr sur CRAN, vous pouvez utiliser le %$% opérateur:

iris %$% 
  Species %>%
  levels

C'est essentiellement un wrapper autour de with mais plus agréable que

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

ou

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

Il est conçu pour être pratique lorsque les fonctions n'ont pas leur propre argument de données, par exemple avec l'intrigue que vous pouvez faire

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

mais par exemple avec ts.plot vous ne pouvez pas faire ça, alors maintenant:

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

[ouais, je sais que l'exemple n'a aucun sens, mais il illustre le point]

Notez également que [<- et [[<- ont également des alias, inset et inset2 ..

28
Stefan

Utilisation use_series, extract2 et extract pour $, [[, [, respectivement.

?extract

magrittr fournit une série d'alias qui peuvent être plus agréables à utiliser lors de la composition de chaînes à l'aide du %>% opérateur. "

Pour votre exemple, vous pouvez essayer

iris %>%
  extract("Species")

et

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

Voir le bas de cette page pour plus: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

30
Bangyou

Une solution tidyverse plus récente: pluck() de purrr (depuis 0.2.3) extrait un élément nommé d'une liste (ou une colonne nommée d'un bloc de données):

library(tidyverse)

iris %>% 
  pluck("Species")

Remarque: pour accéder à l'élément par numéro d'index, vous pouvez également utiliser first(), last() ou nth() à partir de dplyr sur n'importe quel objet (liste, trame de données, matrice) pour extraire son premier, dernier ou nième élément:

iris %>% 
  as.list() %>%  # unnecessary, just to show it works on lists too
  last()         # or nth(5) in this case, to get Species
1
iNyar