Выбор нескольких столбцов по имени без необходимости вводить каждое имя

Как выбрать несколько столбцов по имени без необходимости вводить каждое имя.

Например, у меня есть следующий код:

CTDB[, c(
"ENJOY_TV_RADIO_CHILD", 
"ENJOY_FMLY_CLOSE_FRND_CHILD", 
"ENJOY_HOBBIES_CHILD", 
"ENJOY_FAV_MEAL_CHILD",
"ENJOY_SHOWER_CHILD", 
"ENJOY_SCENT_CHILD", 
"ENJOY_PPL_SMILE_CHILD", 
"ENJOY_LOOK_SMART_CHILD", 
"ENJOY_READ_CHILD", 
"ENJOY_FAV_DRINK_CHILD", 
"ENJOY_SMALL_THINGS_CHILD", 
"ENJOY_LANDSCAPE_CHILD", 
"ENJOY_HELP_OTHR_CHILD", 
"ENJOY_PRAISE_CHILD")] <-revalue(as.matrix(CTDB[, c(
"ENJOY_TV_RADIO_CHILD", 
"ENJOY_FMLY_CLOSE_FRND_CHILD",
"ENJOY_HOBBIES_CHILD", 
"ENJOY_FAV_MEAL_CHILD", 
"ENJOY_SHOWER_CHILD", 
"ENJOY_SCENT_CHILD", 
"ENJOY_PPL_SMILE_CHILD", 
"ENJOY_LOOK_SMART_CHILD", 
"ENJOY_READ_CHILD", '
"ENJOY_FAV_DRINK_CHILD", 
"ENJOY_SMALL_THINGS_CHILD", 
"ENJOY_LANDSCAPE_CHILD", 
"ENJOY_HELP_OTHR_CHILD", 
"ENJOY_PRAISE_CHILD")]), c("0"=3, "1"=2, "2"=1, "3"=0))

Все столбцы в порядке, но вместо выбора по номеру, как показано ниже

CTDB[,74:87] <-revalue(as.matrix(CTDB[,74:87]), c("0"=3, "1"=2, "2"=1, "3"=0))

Я хотел бы выбрать по имени столбца.

Благодарю вас!


person KKhosra    schedule 09.02.2018    source источник
comment
Что ты имеешь в виду? Почему вам не нужны цифры?   -  person Onyambu    schedule 09.02.2018
comment
Все столбцы, которые вы хотите выбрать, начинаются с ENJOY_ и заканчиваются на CHILD? И если да, хотите ли вы выбрать их все?   -  person Rui Barradas    schedule 09.02.2018
comment
@Onyambu Мне не нужны числа, потому что положение столбцов в наборе данных может измениться.   -  person KKhosra    schedule 09.02.2018
comment
@RuiBarradas Да, все столбцы начинаются с ENJOY_ и заканчиваются на CHILD, и да, я хочу выбрать все, что начинается с ENJOY_ и заканчивается на CHILD   -  person KKhosra    schedule 09.02.2018
comment
по какому критерию можно определить нужные столбцы. Что у них общего?   -  person Onyambu    schedule 09.02.2018


Ответы (2)


Вы должны использовать grep или grepl

CTBD[,grep("^ENJOY.*CHILD$",colnames(CTBD)]

or

CTBD[,grepl("^ENJOY.*CHILD$",colnames(CTBD)]
person Onyambu    schedule 09.02.2018
comment
Я получил это сообщение об ошибке: Ошибка в grep(ENJOY.*CHILD, x): объект 'x' не найден - person KKhosra; 09.02.2018
comment
Благодарю вас! Я получил это предупреждающее сообщение: Предупреждающее сообщение: В матрице (значение, n, p): длина данных [49890] не является дольной или кратной количеству столбцов [14]. Вы знаете, что это значит? - person KKhosra; 09.02.2018
comment
вы пытаетесь создать другую матрицу? у вас есть 14 столбцов, но длина даты, которую вы имеете, не может быть разделена на 14 столбцов - person Onyambu; 09.02.2018
comment
Если CTBD — это матрица, вам нужно использовать colnames, который также работает с фреймами данных. - person Rui Barradas; 09.02.2018
comment
Я все еще получаю это сообщение Предупреждающее сообщение: В матрице (значение, n, p): длина данных [49890] не является дольной или кратной количеству столбцов [14] - person KKhosra; 09.02.2018

Если вам нужно сделать это как часть конвейера, вы также можете использовать dplyr::select и его вспомогательные функции двумя эквивалентными способами, включая тот, который позволяет избежать регулярных выражений:

CTBD %>% select(matches("^ENJOY.*CHILD$"))
CTBD %>% select(intersect(starts_with("ENJOY"), ends_with("CHILD")))
person Calum You    schedule 09.02.2018