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

如何根据字符串向量选择数据帧的列,以确保完全一致?

  •  1
  • RoyBatty  · 技术社区  · 1 年前

    我有一个数据框架,其中包含以下列名称:

    NewYork_10
    NewYork_20
    NewYork3_10
    NewYork3_20
    NewYork4_10
    NewYork4_20
    HongKong_10
    HongKong_20
    SanFrancisco_10
    SanFrancisco_20
    

    我有一个向量:

    list <- c("NewYork", "SanFrancisco")
    

    我想要一个脚本来创建一个新的数据帧,选择那些在下划线之前有完全相同字符串的列。 在上面给出的示例中,您将获得一个具有以下列的新数据帧。 纽约_10 纽约_20 旧金山_10 SanFrancisco_20

    我用grep做了几次尝试:

    dplyr::select(matches(list_cities))

    dplyr::select(matches(paste0(list_cities), "_"))

    甚至对向量使用锚点,我不确定这是否可能。

    dplyr::select(matches(paste0("^",list_cities, "_.*")))

    但在任何情况下,它都会捕获以给定子字符串开头的向量的所有值。

    2 回复  |  直到 1 年前
        1
  •  1
  •   GuedesBF    1 年前

    我们也可以使用 matches

    df %>%
        select(matches("(NewYork)|(SanFrancisco)_.*")
    
        2
  •  1
  •   GKi    1 年前

    您可以尝试:

    df[grep("^(NewYork|SanFrancisco)_", names(df))]
    #df[grep(paste0("^(", paste0(name_list, collapse="|"), ")_"), names(df))] #Alternative using the name_list
    #  NewYork_10 NewYork_20 SanFrancisco_10 SanFrancisco_20
    #1          1          1               1               1
    

    或使用 dplyr::select

    library(tidyverse)
    df %>% select(matches("^(NewYork|SanFrancisco)_"))
    #  NewYork_10 NewYork_20 SanFrancisco_10 SanFrancisco_20
    #1          1          1               1               1
    

    哪里 ^ 是字符串的开始, (NewYork|SanFrancisco) 比赛 NewYork SanFrancisco 然后 _ .

    或者使用 startsWith :

    df[Reduce(`|`, lapply(paste0(name_list, "_"), startsWith, x=names(df)))]
    #  NewYork_10 NewYork_20 SanFrancisco_10 SanFrancisco_20
    #1          1          1               1               1
    

    数据(取自@benson23)

    df <- data.frame(NewYork_10 = 1,
               NewYork_20 = 1,
               NewYork3_10 = 1,
               NewYork3_20 = 1,
               NewYork4_10 = 1,
               NewYork4_20 = 1,
               HongKong_10 = 1,
               HongKong_20 = 1,
               SanFrancisco_10 = 1,
               SanFrancisco_20 = 1)
    
    name_list <- c("NewYork", "SanFrancisco")