2016-01-12 19 views
5

Come estrarre gli elementi da un elenco nidificato utilizzando solo il pacchetto purrr? In questo caso voglio ottenere un vettore di intercettazioni dopo aver diviso un data.frame. Ho realizzato ciò di cui ho bisogno usando lapply(), ma mi piacerebbe usare solo le funzioni del pacchetto purrr.Estrarre elementi dall'elenco annidato utilizzando solo le funzioni del pacchetto purrr

library(purrr) 
mtcars %>% 
split(.$cyl) %>% 
map( ~lm(mpg ~ wt, data = .)) %>%  # shorthand NOTE: ~ lm 
lapply(function(x) x[[1]] [1]) %>% # extract intercepts <==is there a purrr function for this line? 
as_vector()        # convert to vector 

Ho cercato map() e at_depth(), ma nulla sembrava funzionare per me.

+0

Come hai provato a 'map'? Se cancelli il nome della funzione 'lapply' e lo sostituisci con' map' - gli stessi stessi argomenti - funziona perfettamente. – Gregor

+1

Ho trovato utile la pagina di aiuto per 'map'. Sembra che tu possa fare qualche codifica di scorciatoia rispetto a 'lapply'. Come 'map_dbl (c (1, 1))' per l'indicizzazione di elenchi annidati. – aosmith

+0

@ Gregor. Aaaargh! Questo è troppo ovvio. Grazie – hackR

risposta

12

Le funzioni map dispongono di una codifica stenografica per l'indicizzazione di elenchi annidati. Un utile snippet dalla pagina di aiuto:

Per indicizzare in profondità in un elenco nidificato, utilizzare più valori; c ("x", "y") è equivalente a z [["x"]] [["y"]].

Quindi, utilizzando il codice per gli indici annidati insieme map_dbl, che si riduce a un vettore, si può semplicemente fare:

mtcars %>% 
    split(.$cyl) %>% 
    map(~lm(mpg ~ wt, data = .)) %>% 
    map_dbl(c(1, 1)) 

     4  6  8 
39.57120 28.40884 23.86803 

Ho trovato anche questo blog post introducendo purrr 0.1.0 utile, in quanto ha dato un qualche altro esempio della codifica stenografica che ho finito per usare.

+0

Perfetto. Questa è la migliore risposta per me perché non emette quei vettori con nomi come attributi. Saluti! – hackR