如何根据字符串向量选择 Dataframe 的列,并匹配以确保完全一致?

ehxuflar  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(149)

我有一个包含以下列名的 Dataframe :

NewYork_10
NewYork_20
NewYork3_10
NewYork3_20
NewYork4_10
NewYork4_20
HongKong_10
HongKong_20
SanFrancisco_10
SanFrancisco_20

我有一个向量:

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

我需要一个创建新 Dataframe 的脚本,选择下划线前具有完全相同字符串的列。在上面给出的示例中,您将获得具有以下列的新 Dataframe 。NewYork_10 NewYork_20 SanFrancisco_10 SanFrancisco_20
我对grep做了几次尝试:
dplyr::select(matches(list_cities))
dplyr::select(matches(paste0(list_cities), "_"))
甚至用锚来表示向量,我不确定这是否可行。
dplyr::select(matches(paste0("^",list_cities, "_.*")))
但在每种情况下,它都捕获了向量中,以给定子字符串开头的所有值。

disho6za

disho6za1#

我们也可以使用matches

df %>%
    select(matches("(NewYork)|(SanFrancisco)_.*")
kcwpcxri

kcwpcxri2#

您可以尝试:

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)匹配NewYorkSanFrancisco后跟_
或者使用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")

相关问题