Chọn cột dựa trên đối sánh chuỗi - dplyr :: select


83

Tôi có một khung dữ liệu ("dữ liệu") với rất nhiều và rất nhiều cột. Một số cột chứa một chuỗi nhất định ("chuỗi tìm kiếm").

Làm cách nào tôi có thể 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 đã thử:

# 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 hoạt động.

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

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

Nhưng tôi không biết cách lấy vectơ số của cột IDs từ grepl()biểu thức của mình .


Xem thêm câu trả lời SO này cho nhiều chuỗi và các trận đấu: stackoverflow.com/q/29018292/3871924
agenis

Câu trả lời:


114

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

select(iris,contains("Sepal"))

Xem phần Selection trong ?selectcho nhiều người giúp đỡ khác thích starts_with, ends_withvv


2
Ghi chú rằng bạn có thể đến lột 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ụ như: select(iris, contains(".") )Không chắc làm thế nào bạn có nghĩa vụ phải vượt qua fixed=TRUEđể buộc tìm kiếm một thực tế"."
thelatemail

1
@thelatemail Cảm giác đó giống như một sự giám sát trong mã hoặc tài liệu (tức là chúng tôi đang giả định fixed = TRUEhoặc tương đương). dplyr vẫn còn khá trẻ.
joran

@thelatemail Rất tiếc! Tôi cũng vậy!
joran

6
Chà, đó là một khởi đầu khá khập khiễng cho sự nghiệp github của tôi. Sắp có 'Đóng như bản sao'!
thelatemail,

1
@MattBannert xem giải pháp tôi đã cung cấp
Boern


30

Không cần sử dụng selectchỉ cần sử dụng [thay thế

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

Hãy thử với iristập dữ liệu

>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

6
@arumbay dplyrlà một panceum - ngay cả khi bạn có thể làm điều đó base, cú pháp tiêu chuẩn không đẹp bằng / có thể đọc được / có thể kết hợp - hãy xem câu trả lời của tôi .
Piotr Migdal

20

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

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

Sử dụng ORtoán tử regex ( |)

LƯU Ý : Nếu bạn thực sự có một vectơ đơn giản của tên cột (và không cần sức mạnh của RegExpression), vui lòng xem nhận xét bên dưới câu trả lời này (vì đó là giải pháp rõ ràng hơn).


5
Đối với một vector của các tên cột được biết đến, sử dụngselect(df, one_of(array_of_colnames))
AlexR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.