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

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 に答える