2016-01-12 16 views
5

Làm cách nào để trích xuất các phần tử từ danh sách lồng nhau chỉ bằng gói purrr? Trong trường hợp này, tôi muốn lấy một véc tơ của các chặn sau khi tách một data.frame. Tôi đã hoàn thành những gì tôi cần bằng cách sử dụng lapply(), nhưng tôi chỉ muốn sử dụng các hàm purrr package.Trích xuất các phần tử từ danh sách lồng nhau chỉ bằng các hàm từ gói 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 

Tôi đã thử bản đồ() và at_depth() nhưng dường như không có gì phù hợp với tôi.

+0

Bạn đã thử 'bản đồ' như thế nào? Nếu bạn xóa tên hàm 'lapply' và thay thế nó bằng' map' - cùng một đối số chính xác - nó hoạt động tốt. – Gregor

+1

Tôi tìm thấy trang trợ giúp cho 'bản đồ' hữu ích ở đây. Có vẻ như bạn có thể thực hiện một số mã hóa ngắn gọn so với 'lapply'. Giống như 'map_dbl (c (1, 1))' để lập chỉ mục các danh sách lồng nhau. – aosmith

+0

@Gregor. Aaaargh! Điều đó quá rõ ràng. Cảm ơn – hackR

Trả lời

12

Các chức năng map có một số mã viết tắt để lập chỉ mục danh sách lồng nhau. Đoạn trích hữu ích từ trang trợ giúp:

Để lập chỉ mục sâu vào danh sách lồng nhau, hãy sử dụng nhiều giá trị; c ("x", "y") tương đương với z [["x"]] [["y"]].

Vì vậy, sử dụng mã cho chỉ số lồng cùng với map_dbl, làm giảm tới một vector, bạn chỉ có thể làm:

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

     4  6  8 
39.57120 28.40884 23.86803 

Tôi cũng thấy blog post này giới thiệu purrr 0.1.0 hữu ích, vì nó đã đưa ra một thêm một vài ví dụ về viết tắt viết tắt mà tôi đã sử dụng.

+0

Hoàn hảo. Đây là câu trả lời tốt nhất cho tôi bởi vì nó không xuất các vector đó với tên như các thuộc tính. Chúc mừng! – hackR

Các vấn đề liên quan