以编程方式选择包含字符串的列名

时间:2017-07-09 13:49:30

标签: r select quote expr

给出如下数据框:

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 个答案:

答案 0 :(得分:2)

purrr 解决方案:

microservices-monitor-prod.yml

使用管道:

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(`|`))

但它不漂亮......

答案 1 :(得分:2)

我们可以做到

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

答案 2 :(得分:0)

自我回答 - 这是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

答案 3 :(得分:0)

我不了解确切的要求,但这是解决方案。

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