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


83

У меня есть фрейм данных («данные») с множеством столбцов. Некоторые столбцы содержат определенную строку ("search_string").

Как я могу использовать, 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 см. Решение, которое я предоставил
Boern

60

Ты можешь попробовать:

select(data, matches("search_string"))

Это более общий характер, чем contains- вы можете использовать регулярное выражение (например "one_string|or_the_other").

Дополнительные примеры см: http://rpackages.ianhowson.com/cran/dplyr/man/select.html .


1
лучше, так как поддерживает регулярное выражение
Boern

Ссылка сейчас не работает
pratikpc

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- это panceum - даже если вы можете это сделать base, стандартный синтаксис не такой приятный / читаемый / составной - см. мой ответ .
Петр Мигдал

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.