Выбрать имена столбцов, содержащие строку программно
С учетом фрейма данных, как:
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