2015-10-22 14 views
8

Thường thì tôi sẽ muốn chọn một tập con của các biến trong đó tập hợp con là kết quả của một hàm. Trong trường hợp đơn giản này, lần đầu tiên tôi nhận được tất cả các tên biến mà liên quan đến đặc điểm chiều rộngSử dụng lựa chọn của dplyr nơi các tên biến được trích dẫn

library(dplyr) 
library(magrittr) 

data(iris) 

width.vars <- iris %>% 
       names %>% 
       extract(grep(".Width", .)) 

nào trả về:

>width.vars 
[1] "Sepal.Width" "Petal.Width" 

Nó sẽ là hữu ích để có thể sử dụng những lợi nhuận như là một cách để chọn cột (và trong khi tôi biết rằng và anh chị em của nó tồn tại, có rất nhiều tập con phức tạp hơn tôi muốn thực hiện, và ví dụ này được thực hiện tầm thường cho mục đích của ví dụ này.

Nếu tôi cố gắng sử dụng chức năng này như aw ay để chọn cột, những điều sau sẽ xảy ra:

iris %>% 
    select(Species, 
     width.vars) 

Error: All select() inputs must resolve to integer column positions. 
The following do not: 
* width.vars 

Làm cách nào để sử dụng dplyr::select với vectơ tên biến được lưu trữ dưới dạng chuỗi?

Trả lời

17

Trong vòng dplyr, hầu hết các lệnh đều có phiên bản thay thế kết thúc bằng '_' chấp nhận chuỗi là đầu vào; trong trường hợp này, select_. Đây thường là những gì bạn phải sử dụng khi bạn đang sử dụng dplyr theo chương trình.

iris %>% select_(.dots=c("Species",width.vars)) 
5

Trước hết, bạn có thể làm sự lựa chọn trong dplyr với

iris %>% select(Species, contains(".Width")) 

Không cần phải tạo ra các vector của tên riêng. Nhưng nếu bạn đã có một danh sách các cột như tên chuỗi, bạn có thể làm

width.vars <- c("Sepal.Width", "Petal.Width") 
iris %>% select(Species, one_of(width.vars)) 

Xem trang ?select giúp đỡ cho tất cả các tùy chọn có sẵn.

+1

cảm ơn câu trả lời của bạn, nhưng như tôi đã nói trong câu hỏi, tôi biết 'chọn' và tôi quan tâm đến những trường hợp mà tôi muốn thực hiện một hàm phức tạp hơn cho tập hợp biến tên. – tomw

+2

Vì vậy, đó là những gì 'one_of' sẽ làm như được hiển thị ở trên là tốt. – MrFlick

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