在R中使用带有两个参数的grep

huwehgph  于 2023-06-27  发布在  其他
关注(0)|答案(5)|浏览(103)

我有一个相当简单的问题,如果我有一个名为“T_01_X_1”,“T_02_X_1”,“T_03_X_1”的变量和变量“T_01_Y_1”,“T_02_Y_1”,“T_03_Y_1”,我只想用grep函数提取包含X的变量,并从T开始。我该怎么做?

df <- read.table(header=TRUE, text="
T_01_X_1 T_02_X_2 T_03_X_3 T_01_Y_1 T_02_Y_2 T_03_Y_3
1 2 3 2 1 3 
2 3 4 2 1 3
2 3 4 2 1 4 
2 4 5 2 1 3 
")

items <- df[grep("T.*", names(df))]
qltillow

qltillow1#

我们可以使用select

library(dplyr)
df %>%
    select(matches('^T_\\d+_X'))
  T_01_X_1 T_02_X_2 T_03_X_3
1        1        2        3
2        2        3        4
3        2        3        4
4        2        4        5
gg0vcinb

gg0vcinb2#

你可以用-

df[grep("^T.*X", names(df))]

#  T_01_X_1 T_02_X_2 T_03_X_3
#1        1        2        3
#2        2        3        4
#3        2        3        4
#4        2        4        5

这将选择名称中以'T'开头、后跟'X'的列。

kzmpq1sx

kzmpq1sx3#

我使用intersect函数来实现:

df[intersect(grep("T.*", names(df)),grep("X", names(df)))]

  T_01_X_1 T_02_X_2 T_03_X_3
1        1        2        3
2        2        3        4
3        2        3        4
4        2        4        5
t5fffqht

t5fffqht4#

在正则表达式中,您可以使用插入符号(^)在搜索列表的开头扫描字母/单词。要匹配单词中任何位置的特定字符,您可能需要用match-anything正则表达式(.*)包围该项目,该正则表达式接受任何字母(.)任意次数(*)。
这将为您提供以下正则表达式来匹配您要查找的内容:^T.*X.*

df[grep("^T.*X.*", names(df))] 
#>   T_01_X_1 T_02_X_2 T_03_X_3
#> 1        1        2        3
#> 2        2        3        4
#> 3        2        3        4
#> 4        2        4        5
zbq4xfa0

zbq4xfa05#

作为另一种选择,如果您不想使用正则表达式,dplyr select helper可能会很有用。

library(dplyr)

df %>% 
  select(starts_with("T") & contains("X"))

#  T_01_X_1 T_02_X_2 T_03_X_3
#1        1        2        3
#2        2        3        4
#3        2        3        4
#4        2        4        5

你也可以用stringr做类似的事情。

library(stringr)

df[str_starts(names(df), "T") & str_detect(names(df), "X")]

相关问题