给出如下数据框:
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)
答案 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"))