2017-02-08 9 views
2

Я хотел бы использовать dplyr для выбора определенных столбцов, соответствующих строковому вектору.Использование starts_with в dplyr с вектором частичных имен столбцов

one <- seq(1:10) 
two <- rnorm(10) 
three <- runif(10, 1, 2) 
four <- -10:-1 

df <- data.frame(one, two, three, four) 

vars <- c('on', 'thr') 

Я хочу, чтобы выбрать только те столбцы, в ФР, названия которых начинают with'on»или„Чет“:

dplyr::select_(df, starts_with(vars)) 

Однако выше не работает.

+2

'select (df, sapply (vars, starts_with))'. Я думаю, что это безопасно в большинстве случаев. – Chrisss

+0

Если вы говорите _However, то выше не работает. Что это за сообщение об ошибке? – Uwe

+0

Простым, неуклюжим решением является 'df%>% select (starts_with (vars [1]), starts_with (vars [2]))' –

ответ

2

Различные вспомогательные функции выбора в dplyr предназначены для использования только одной символьной строки для сопоставления. Вы можете обойти эту проблему, объединив свои строки в один регулярное выражение и использование matches:

vars <- paste0("^(", paste(vars, collapse="|"), ")") 
select(df, matches(vars)) 
+0

Спасибо, @Hong Ooi. Ваше первое утверждение неверно. select имеет вспомогательную функцию, называемую one_of, которая принимает переменную, которая является вектором имен столбцов в качестве входных данных. Я надеялся, что смогу использовать one_of вместе с starts_with, чтобы получить то, что я хотел. В любом случае, ваше решение приятно, но я хочу, чтобы в dplyr был способ сделать это, потому что его легче читать и элегантнее. –

0

Предположительно вы знаете заранее, потому что вы кодирование его в то, что имя столбца спичек вы хотите, чтобы вы могли использовать

select(starts_with("on"), starts_with("thr")) 

Ах, я вижу, что Тони Ладсон уже предложил это. Однако, в зависимости от вашего конкретного варианта использования, я не вижу необходимости получать их из вектора.

+0

Я имею в виду, если вы хотите, например, интерактивно выбирать имена столбцов, которые пользователь мог бы выбрать в блестящее приложение, ну у вас уже есть полные имена столбцов. – doctorG

0

Вот решение с использованием starts_with:

df %>% 
    select(map(c('on', 'thr'), 
      starts_with, 
      vars = colnames(.)) %>% 
     unlist()) 

В принципе, идея заключается в том, чтобы применить функцию starts_with к вектору имен с помощью map. Но чтобы заставить его работать, нужно добавить аргумент vars (список кодовых имен), а затем перечислить результат map, чтобы получить вектор позиций.

Это решение расширяет один из Chrisss до случая, когда имеется несколько совпадений хотя бы для одной записи.