2016-01-12 23 views
5

Yuvalanmış bir listeden öğeleri yalnızca purrr paketi kullanarak nasıl ayırım? Bu durumda bir data.frame ayrıldıktan sonra bir kesişme vektörü almak istiyorum. Ben lapply() kullanarak ihtiyacım olan şeyi başardım, ancak sadece purrr paketini kullanmak istiyorum.Yuvalanmış listeden öğeleri yalnızca purrr paketinden işlevler kullanarak ayıkla

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 

ben harita() ve at_depth() denedim ama hiçbir şey benim için çalışıyor gibiydi.

+0

Nasıl 'map' denediniz? Eğer 'lapply' işlev adını silerseniz ve 'map' ile değiştirirseniz - aynı argümanlar - sadece iyi çalışır. – Gregor

+1

Burada 'map' için yardım sayfasını buldum. "Lapply" ile karşılaştırıldığında bazı kısa kesimli kodlamalar yapabileceğiniz gibi görünüyor. İç içe geçmiş listeleri indekslemek için 'map_dbl (c (1, 1)) 'gibi. – aosmith

+0

@Gregor. Aaaargh! Bu çok açık. Teşekkürler – hackR

cevap

12

map işlevlerinin iç içe geçmiş listeleri dizine eklemek için bazı kısa kodlama kodlamaları vardır. Yardım sayfasındaki faydalı bir pasaj:

İç içe geçmiş bir listeyi derinlemesine endekslemek için birden fazla değer kullanın; c ("x", "y") , z [["x"]] [["y"]] öğesine eşdeğerdir.

Yani bir vektöre azaltır map_dbl birlikte iç içe endeksler için kodu kullanarak, sadece yapabilirsiniz:

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

     4  6  8 
39.57120 28.40884 23.86803 

Ben de bir verdi bu blog post, 0.1.0 purrr yararlı tanıtan bulundu Ben kullanarak bittim shorthand kodlama birkaç örnek.

+0

Mükemmel. Bu benim için en iyi cevaptır, çünkü bu vektörleri nitelik olarak isimler vermez. Şerefe! – hackR