4

给定一个数据框,如:

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

4 回答 4

4

我们能做的

df %>% 
   select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
   select(order(sub(".*_", "", names(.))))
于 2017-07-09T14:16:25.690 回答
2

咕噜解决方案:

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]

但这并不漂亮...

于 2017-07-09T14:10:31.930 回答
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
于 2017-07-09T15:39:49.673 回答
0

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

select(df, matches("a|b"))
于 2017-07-09T15:53:28.153 回答