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

С учетом фрейма данных, как:

df <- data.frame(z_a = 1:2,
                 z_b = 1:2,
                 y_a = 3:4,
                 y_b = 3:4)

Я могу выбрать имена столбцов, которые содержат символ с:

library(dplyr)
df %>% select(contains("a"), contains("b"))

  z_a y_a z_b y_b
1   1   3   1   3
2   2   4   2   4

Обратите внимание, что порядок столбцов изменился. Колонны, содержащие a быть первым, прежде чем столбцы, содержащие b

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

searchfor <- letters[1:2]

С помощью searchfor Я хотел бы сделать следующее выражение и использовать его в select заявление:

E <- quote(contains(searchfor[1]), contains(searchfor[2]))
df %>% select_(E) 

4 ответа

Решение

Мы можем

df %>% 
   select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
   select(order(sub(".*_", "", names(.))))

мурлыканье решение:

library(purrr)
ind_lgl <- map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
  pmap_lgl(`|`)

df[ind_lgl]

С трубой:

df %>%
  `[`(map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
        pmap_lgl(`|`))

Если вы получите правильный заказ:

rank <- map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
  pmap(c) %>%
  map(which)


ind_chr <- data_frame(colnames = names(df), rank) %>%
  mutate(l = lengths(rank)) %>%
  filter(l > 0) %>%
  mutate(rank = unlist(map(rank, ~ .x[[1]]))) %>%
  arrange(rank) %>%
  pull(colnames)


df[ind_chr]

Но это не красиво...

Я не понимаю точное требование, но это решение.

select(df, matches("a|b"))

Самостоятельный ответ - вот решение с select_ и что до сих пор использует contains - на тот случай, если кому-то еще интересно

library(iterators)
library(dplyr)
s <- paste0("c(", paste0(sapply(iter(searchfor), function(x) paste0("contains(\"", x, "\")")), collapse=","), ")")
df %>% select_(., s)

  z_a y_a z_b y_b
1   1   3   1   3
2   2   4   2   4
Другие вопросы по тегам