Как выбрать переменные в кадре данных R, имена которых содержат определенную строку? - PullRequest
17 голосов
/ 27 сентября 2011

Два примера были бы очень полезны для меня.

Как бы я выбрал: 1) переменные, имена которых начинаются с b или B (то есть регистронезависимы) или же 2) переменные, имена которых содержат 3

df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), 
  levels = c("Low", "Med", "Hi"), ordered = TRUE),
  a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9),
  b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4),
  B1 = c(3, 6, 4, 4))

Ответы [ 3 ]

32 голосов
/ 27 сентября 2011

Если вам нужны только имена переменных:

grep("^[Bb]", names(df), value=TRUE)

grep("3", names(df), value=TRUE)

Если вы хотите выбрать эти столбцы, то либо

df[,grep("^[Bb]", names(df), value=TRUE)]
df[,grep("^[Bb]", names(df))]

Первый использует выбор по имени, второй использует выбор по набору номеров столбцов.

3 голосов
/ 01 августа 2018

Хотя мне и нравится ответ выше, я хотел бы также дать решение "tidyverse". Если вы делаете много трубок и пытаетесь сделать несколько вещей одновременно, как я часто делаю, вам может понравиться этот ответ. Кроме того, я нахожу этот код более "по-человечески" читаемым.

Функция dplyr select_vars будет выбирать переменные из символьного вектора в первом аргументе, который должен содержать имена соответствующего фрейма данных, на основе вспомогательной функции выбора, такой как starts_with или matches

library(dplyr)

df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), 
                         levels = c("Low", "Med", "Hi"), ordered = TRUE),
             a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9),
             b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4),
             B1 = c(3, 6, 4, 4))

#will select the names starting with a "b" or a "B"
select_vars(names(df), starts_with('b', ignore.case = TRUE)) 

#use select in conjunction with the previous code
df %>%
  select(select_vars(names(df), starts_with('b', ignore.case = TRUE)))

#Alternatively
select_vars(names(df), matches('^[Bb]'))

Обратите внимание, что по умолчанию для ignore.case установлено значение TRUE, но я привел его здесь, чтобы показать явно, и в случае, если будущие читатели будут любопытно, как настроить код. Также можно использовать аргументы include и exclude, которые также очень полезны. Например, вы можете использовать select_vars(names(df), matches('^[Bb]'), include = 'a1'), если вы хотите, чтобы все начиналось с «B» или «b», и вы хотели также включить «a1».

1 голос
/ 19 февраля 2019

Я думал, что стоит добавить, что select_vars удален с tidyverse версии 1.2.1. Теперь, tidyselect::vars_select(), вероятно, то, что вы ищете в рамках "Tidyverse". Смотри документацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...