代码之家  ›  专栏  ›  技术社区  ›  CPak

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

  •  4
  • CPak  · 技术社区  · 8 年前

    给定如下数据帧:

    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 回复  |  直到 8 年前
        1
  •  4
  •   akrun    8 年前

    我们可以做到

    df %>% 
       select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
       select(order(sub(".*_", "", names(.))))
    
        2
  •  2
  •   F. Privé    8 年前

    解决方案:

    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]
    

    但这并不漂亮。。。

        3
  •  1
  •   PIG    8 年前

    select(df, matches("a|b"))
    
        4
  •  0
  •   CPak    8 年前

    自我回答 -这里有一个解决方案 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