R 如何使用变量名中的多个正则表达式来子集数据帧?

R 如何使用变量名中的多个正则表达式来子集数据帧?,r,R,我有一个包含500多个命名变量的数据框架,我只想选择名称中包含字符串“xyz”和“abc”的列。第一个字母有时大写,有时不大写,所以我使用正则表达式“[Aa]bc”等 我在一个名为df的数据框中拥有完整的数据集,我正在通过使用grep()从df中选择变量来构建一个名为df2的新数据框。我可以一次做一个,然后用cbind()将它们粘在一起,但我想知道如何一次完成这一切 我以为我可以将多个条件传递给grep(),但似乎在这里卡住了 举一个非常简单的例子: df <- data.frame(ab

我有一个包含500多个命名变量的数据框架,我只想选择名称中包含字符串“xyz”和“abc”的列。第一个字母有时大写,有时不大写,所以我使用正则表达式“[Aa]bc”等

我在一个名为df的数据框中拥有完整的数据集,我正在通过使用grep()从df中选择变量来构建一个名为df2的新数据框。我可以一次做一个,然后用cbind()将它们粘在一起,但我想知道如何一次完成这一切

我以为我可以将多个条件传递给grep(),但似乎在这里卡住了

举一个非常简单的例子:

df <- data.frame(abc=1:3, def=4:6, Xyz=7:9, Abc=10:12, xyz=13:15)

  abc def Xyz Abc xyz
1   1   4   7  10  13
2   2   5   8  11  14
3   3   6   9  12  15
df我们也可以使用“纯”RegEx方法忽略大小写。否则,可以将
ignore.case
设置为
TRUE
,如前所示:

df[grepl("(?i)[a-c]|(?i)[x-z]", names(df))]
  abc Xyz Abc
1   1   7  10
2   2   8  11
3   3   9  12
我们也可以使用
stringi

df[stri_detect(names(df), regex = "xyz|abc",case_insensitive = TRUE)]
  abc Xyz Abc
1   1   7  10
2   2   8  11
3   3   9  12
一种
tidyverse
方法:

 library(dplyr)
  library(stringi)

df %>% 
  purrr::keep(stri_detect(names(df),
                           regex = "xyz|abc",case_insensitive = TRUE))
  abc Xyz Abc
1   1   7  10
2   2   8  11
3   3   9  12

您需要将正则表达式包含在一个字符串中

df[,grep("[Aa]bc|[Xx]yz", names(df))]

#  abc Xyz Abc
#1   1   7  10
#2   2   8  11
#3   3   9  12

有一个参数
ignore.case
,如果设置为
TRUE
,它会忽略(大写/小写)大小写,即

df[grepl('xyz|abc', names(df), ignore.case = TRUE)]

#   abc Xyz Abc
#1   1   7  10
#2   2   8  11
#3   3   9  12

如果将
ignore.case
设置为true,为什么在正则表达式(第一种情况)中使用大写字母?我在这里遗漏了什么?在看到OP的实际预期输出之前,我回答了这个问题。被
cbind
弄糊涂了,所以可能忘了编辑它。不管怎样,我已经把它移除了,我只会展示一个整洁的方法。哦,好的。我有点正则表达式盲,所以我不能翻译那个正则表达式,所以我的问题是如果我遗漏了什么。
grep
也有忽略。谢谢!这也行。我只是因为没有把所有的正则表达式都放在同一个引号里而被挂断了。
 library(dplyr)
  library(stringi)

df %>% 
  purrr::keep(stri_detect(names(df),
                           regex = "xyz|abc",case_insensitive = TRUE))
  abc Xyz Abc
1   1   7  10
2   2   8  11
3   3   9  12
df[,grep("[Aa]bc|[Xx]yz", names(df))]

#  abc Xyz Abc
#1   1   7  10
#2   2   8  11
#3   3   9  12
df[grepl('xyz|abc', names(df), ignore.case = TRUE)]

#   abc Xyz Abc
#1   1   7  10
#2   2   8  11
#3   3   9  12