Wybierz kolumny na podstawie dopasowania ciągów - dplyr :: select


83

Mam ramkę danych („dane”) z dużą ilością kolumn. Niektóre kolumny zawierają określony ciąg („ciąg_wyszukiwania”).

Jak mogę użyć dplyr::select()podzbioru zawierającego tylko kolumny zawierające ciąg?

Próbowałem:

# 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))]) 

Żadne z nich nie działa.

Wiem, że select()akceptuje wektory numeryczne jako substytut kolumn np .:

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

Ale nie wiem, jak uzyskać numeryczny wektor kolumn IDs z mojego grepl()wyrażenia.


Zobacz także tę odpowiedź SO dla wielu ciągów i dopasowań: stackoverflow.com/q/29018292/3871924
agenis

Odpowiedzi:


114

W świecie dplyr spróbuj:

select(iris,contains("Sepal"))

Zobacz sekcję wybór w ?selectdla wielu innych pomocników podoba starts_with, ends_withitp


2
Uważaj, możesz łatwo się z tym uporać, ponieważ próbując uniknąć wyrażenia regularnego, wyrażenie regularne wraca, by cię ugryźć, np .: select(iris, contains(".") )Nie jestem pewien, jak masz przejść, fixed=TRUEaby wymusić wyszukiwanie rzeczywistego"."
thelatemail

1
@thelatemail To wydaje się być przeoczeniem w kodzie lub w dokumentacji (tj. czy zakładamy, fixed = TRUEczy równoważne). dplyr jest wciąż dość młody.
joran

@thelatemail Ups! Ja też!
joran

6
Cóż, to raczej kiepski początek mojej kariery na githubie. „Zamknij jako duplikat” już wkrótce!
thelatemail

1
@MattBannert zobacz rozwiązanie, które
podałem


30

Nie ma potrzeby używania selectpo prostu użyj [zamiast tego

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

Spróbujmy z iriszestawem danych

>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 dplyrto panceum - nawet jeśli możesz to zrobić base, standardowa składnia nie jest tak ładna / czytelna / kompozycyjna - zobacz moją odpowiedź .
Piotr Migdal

20

W oparciu o odpowiedź Piotra Migdalsa chcę podać alternatywne rozwiązanie umożliwiające wektor ciągów:

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

Korzystanie z ORoperatora regex ( |)

UWAGA : Jeśli naprawdę masz zwykły wektor nazw kolumn (i nie potrzebujesz mocy RegExpression), zobacz komentarz pod tą odpowiedzią (ponieważ jest to czystsze rozwiązanie).


5
Aby uzyskać wektor znanych nazw kolumn, użyjselect(df, one_of(array_of_colnames))
AlexR
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.