Виберіть стовпці на основі відповідності рядків - dplyr :: select


83

У мене є фрейм даних ("дані") з великою кількістю стовпців. Деякі стовпці містять певний рядок ("рядок_пошуку").

Як я можу використати dplyr::select()для надання мені підмножини, що включає лише стовпці, що містять рядок?

Я намагався:

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

Жоден з них не працює.

Я знаю, що select()приймає числові вектори як заміну стовпців, наприклад:

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

Але я не знаю, як отримати числовий вектор стовпців IDs з мого grepl()виразу.


Дивіться також цей SO відповідь на кілька рядків і сірників: stackoverflow.com/q/29018292/3871924
agenis

Відповіді:


114

У світі dplyr спробуйте:

select(iris,contains("Sepal"))

Дивіться розділ Вибір в ?selectпротягом багатьох інших помічників подобається starts_with, ends_withі т.д.


2
Остерігайтеся, що ви можете з цим розв'язатися досить легко, оскільки, намагаючись уникнути регулярного виразу, регулярний вираз повертається, щоб вас вкусити, наприклад: select(iris, contains(".") )Не впевнений, як ви повинні перейти fixed=TRUEдо примусового пошуку справжнього"."
thelatemail

1
@thelatemail Це відчувається як недогляд або в коді, або в документах (тобто ми вважаємо, fixed = TRUEчи еквівалент). dplyr ще досить молодий.
joran

@thelatemail На жаль! Так я!
joran

6
Ну, тоді це досить кульгавий початок моєї кар’єри у github. "Закрити як копію" найближчим часом!
thelatemail

1
@MattBannert див. Рішення, яке я запропонував
Боерн,

60

Ви можете спробувати:

select(data, matches("search_string"))

Це загальніше, ніж contains- ви можете використовувати регулярний вираз (наприклад "one_string|or_the_other").

Щоб отримати додаткові приклади, див .: http://rpackages.ianhowson.com/cran/dplyr/man/select.html .


1
краще, оскільки підтримка регулярного виразу
Боерн,

Зараз посилання
недоступне

30

Не потрібно використовувати selectпросто використовувати [замість цього

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

Спробуємо з irisнабором даних

>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 dplyr- це панцеум - навіть коли це можна зробити base, стандартний синтаксис не такий приємний / читабельний / складовий - див. мою відповідь .
Piotr Migdal

20

На основі відповіді Пйотра Мігдалса я хочу надати альтернативне рішення, що дає можливість для вектора рядків:

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

Використання ORоператора регулярних виразів ( |)

УВАГА : Якщо у вас дійсно є звичайний вектор назв стовпців (і вам не потрібна потужність RegExpression), перегляньте коментар під цією відповіддю (оскільки це більш чисте рішення).


5
Для вектора відомих назв стовпців використовуйтеselect(df, one_of(array_of_colnames))
AlexR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.