2014-09-18 19 views
41

Tôi có một khung dữ liệu ("dữ liệu") với rất nhiều và nhiều cột. Một số cột chứa một chuỗi nhất định ("search_string").Chọn các cột dựa trên kết hợp chuỗi - dplyr :: chọn

Tôi làm cách nào để sử dụng dplyr::select() để cung cấp cho tôi một tập hợp con chỉ bao gồm các cột chứa chuỗi?

tôi đã cố gắng:

# columns as boolean vector 
select(data, grepl("search_string",colnames(data))) 

# columns as vector of column names names 
select(data, colnames(data)[grepl("search_string",colnames(data))]) 

Cả hai đều không làm việc.

Tôi biết rằng select() chấp nhận vectơ số như thay thế cho cột ví dụ .:

select(data,5,7,9:20) 

Nhưng tôi không biết làm thế nào để có được một vector số của cột ID s từ biểu grepl() tôi.

+0

Nó được coi là nhiệm vụ của người hỏi để chấp nhận câu trả lời. – petermeissner

+0

Xem thêm câu trả lời SO này cho nhiều chuỗi và kết quả phù hợp: http://stackoverflow.com/q/29018292/3871924 – agenis

Trả lời

55

Trong dplyr thế giới, hãy thử:

select(iris,contains("Sepal")) 

Xem Lựa chọn phần trong ?select cho nhiều người giúp đỡ khác như starts_with, ends_with vv

+1

Hãy coi chừng rằng bạn có thể trở nên vô tình với điều này khá dễ dàng như bằng cách cố gắng tránh regex, regex trở lại để cắn bạn, ví dụ: 'select (iris, contains (". "))' Không chắc chắn làm thế nào bạn có nghĩa vụ phải vượt qua 'cố định = TRUE' để bắt buộc tìm kiếm một thực tế '". "' – thelatemail

+1

@thelatemail Điều đó giống như một sự giám sát trong mã hoặc tài liệu (tức là chúng ta giả sử 'cố định = TRUE' hoặc tương đương). dplyr vẫn còn khá trẻ. – joran

+0

lỗi được mở tại github của dplyr: https://github.com/hadley/dplyr/issues/608 – thelatemail

19

Không cần phải sử dụng select chỉ cần sử dụng [ thay

data[,grepl("search_string", colnames(data))] 

Hãy thử với iris dataset

>iris[,grepl("Sepal", colnames(iris))] 
    Sepal.Length Sepal.Width 
1   5.1   3.5 
2   4.9   3.0 
3   4.7   3.2 
4   4.6   3.1 
5   5.0   3.6 
6   5.4   3.9 
+3

@arumbay 'dplyr' là một panceum - ngay cả khi bạn có thể làm điều đó với' base', cú pháp chuẩn là không phải là tốt đẹp/có thể đọc/composable - xem [câu trả lời của tôi] (http://stackoverflow.com/a/30153441/907575). –

29

Bạn có thể thử:

select(data, matches("search_string")) 

Đó là tổng quát hơn contains - bạn có thể sử dụng regex (ví dụ "one_string|or_the_other").

Để biết thêm ví dụ, hãy xem: http://rpackages.ianhowson.com/cran/dplyr/man/select.html.

+0

tốt hơn vì hỗ trợ regexp – Boern

10

Dựa trên Piotr Migdals phản ứng tôi muốn đưa ra một giải pháp thay thế cho phép khả năng cho một vector của chuỗi:

myVectorOfStrings <- c("foo", "bar") 
matchExpression <- paste(myVectorOfStrings, collapse = "|") 
# [1] "foo|bar" 
df %>% select(matches(matchExpression)) 

Tận dụng của người điều khiển regex OR (|)

+2

Đối với vectơ của các tên cột đã biết, hãy sử dụng 'select (df, one_of (array_of_colnames))' – AlexR

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