2014-11-24 26 views
17

Kể từ khi giới thiệu toán tử %>% trong gói magrittr (và nó được sử dụng trong dplyr), tôi đã bắt đầu sử dụng điều này trong công việc của riêng tôi.Làm thế nào để trích xuất/tập hợp một phần tử từ một danh sách với đường dẫn% magrittr%?

Tuy nhiên, một hoạt động đơn giản đã khiến tôi bối rối. Cụ thể, đây là trích xuất (hoặc subsetting) của các yếu tố từ một danh sách.

Một ví dụ: Trong cơ sở RI sẽ sử dụng $, [ hoặc [[ để trích xuất một phần tử từ một danh sách:

iris$Species 
iris[["Species"]] 

tôi có thể đạt được như vậy bằng cách sử dụng %>% ống:

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

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

Hoặc

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

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

Tuy nhiên, điều này cảm thấy như một giải pháp lộn xộn, lộn xộn.

Có cách nào thanh lịch, kinh điển hơn để trích xuất phần tử từ danh sách bằng cách sử dụng đường ống %>% không?

Lưu ý: Tôi không muốn bất kỳ giải pháp nào liên quan đến dplyr, vì lý do đơn giản là tôi muốn giải pháp làm việc với bất kỳ đối tượng R nào, bao gồm danh sách và ma trận chứ không chỉ khung dữ liệu.

+2

sử dụng use_series, extract2 và trích xuất cho $, [[, [, tương ứng. Để xem danh sách các bí danh, hãy thực thi ví dụ: ? multiply_by. – Bangyou

+0

@Bangyou Thật tuyệt. Tôi không biết điều đó. Bạn có muốn thêm câu trả lời đó làm câu trả lời không? – Andrie

+0

Nhận xét bên: hãy xem 'pipeR', vì nó có các khả năng hơi khác so với 'magrittr' –

Trả lời

18

Trong v 1.5 của magrittr trên cran bạn có thể sử dụng %$% điều hành:

iris %$% 
    Species %>% 
    levels 

Nó thực chất là một wrapper quanh with nhưng đẹp hơn

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

hoặc

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

Nó được thiết kế để thuận lợi khi các hàm không có đối số dữ liệu riêng của chúng, ví dụ:với cốt truyện bạn có thể làm

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

nhưng ví dụ: với ts.plot bạn không thể làm điều đó, vì vậy bây giờ:

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

[yeah, tôi biết ví dụ làm cho không có ý nghĩa, nhưng nó minh họa điểm]

Cũng lưu ý rằng [<-[[<- cũng có bí danh, insetinset2 ..

23

Sử dụng use_series, extract2extract cho $, [[, [, tương ứng.

?extract 

magrittr cung cấp một loạt các bí danh mà có thể dễ chịu hơn để sử dụng khi soạn chuỗi sử dụng toán tử %>%."

Ví dụ, bạn có thể thử

iris %>% 
    extract("Species") 

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

Xem dưới cùng của trang này để biết thêm: http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

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