列名称的grep模式

时间:2015-12-30 16:45:42

标签: r grep

我有一个数据框,想要grep符合特定模式的列名。我有四套模式:

# set 1 (underscore, no A)
  cat1_1
  cat12_12

# set 2 (underscore, A)
  cat4_4A
  cat18_18A

# set 3 (no underscore, no p)
  dog2
  dog12

# set 4 (no underscore, p)
  dog2p
  dog12p

我的实际数据框每组包含不同数量的列,但为简单起见,我在此示例中仅显示每列两列。

ex <- data.frame(cat1_1=c("1a", "1a"),
                 cat12_12=c("1b", "1b"),
                 cat4_4A=c("2a", "2a"),
                 cat18_18A=c("2b", "2b"),
                 dog2=c("3a", "3a"),
                 dog12=c("3b", "3b"),
                 dog2p=c("4a", "4a"),
                 dog12p=c("4b", "4c"))
ex
#      cat1_1 cat12_12 cat4_4A cat18_18A dog2 dog12 dog2p dog12p
#1     1a       1b      2a        2b   3a    3b    4a     4b
#2     1a       1b      2a        2b   3a    3b    4a     4c

我想grep names(ex)以便我获取所有set 1变量,然后单独获取所有set 2变量,依此类推。因此,例如,集合1的grep(PATTERN, names(ex))应该返回:

[1] "cat1_1" "cat12_12"

我很感激每套grep模式的帮助。一个限制是我不想更改任何列名。

3 个答案:

答案 0 :(得分:1)

根据OP显示的示例,如果我们需要在colnames中找到模式,那么以'cat'开头(^)后跟一个或多个数字(\\d+)后跟一个下划线(\\_)后跟一个或多个数字('\ d +')直到字符串结尾($),我们得到'cat1_1','cat12_12'。

 grep('^cat\\d+\\_\\d+$', names(ex), value=TRUE)

类似的逻辑可以用于其他情况。

 grep('^cat\\d+\\_\\d+[A-Z]+$', names(ex), value= TRUE)
 grep('^dog\\d+$', names(ex), value=TRUE)
 grep('^dog\\d+[a-z]+$', names(ex), value=TRUE)

或者通过基于split

创建分组变量来names(ex)列名称的其他选项
 split(names(ex), gsub('\\d+(?=\\_)|(?<=\\_)\\d+|(?<=[a-z])\\d+', 
                             '1', names(ex), perl=TRUE))
 #$cat1_1
 #[1] "cat1_1"   "cat12_12"

 #$cat1_1A
 #[1] "cat4_4A"   "cat18_18A"

 #$dog1
 #[1] "dog2"  "dog12"

 #$dog1p
 #[1] "dog2p"  "dog12p"

答案 1 :(得分:1)

考虑使用^开头,以$ regex结尾:

names(ex)[grep("^cat.*[0-9]$", names(ex))]

names(ex)[grep("^cat.*A$", names(ex))]

names(ex)[grep("^dog.*[0-9]$", names(ex))]

names(ex)[grep("^dog.*p$", names(ex))]

答案 2 :(得分:0)

作为对目前为止的好答案的修正,R有一些“特殊”字符串可以简化过渡到使用正则表达式的过程。例如,[:digit:]将匹配任何数字值,[:alpha:]将匹配任何字母字符。

如果我们将此应用于您正在使用的四个列名称类型,我们将获得以下内容:

grep("^cat[[:digit:]]+_[[:digit:]]+$", names(ex), value=TRUE)
# "cat1_1"   "cat12_12"

grep("^cat[[:digit:]]+_[[:digit:]]+A$", names(ex), value=TRUE)
# "cat4_4A"   "cat18_18A"

grep("^dog[[:digit:]]+$", names(ex), value=TRUE)
# "dog2"  "dog12"

grep("^dog[[:digit:]]+p$", names(ex), value=TRUE)
# "dog2p"  "dog12p"

请注意,我们必须将[:digit:]括在另一组方括号中,以正确描绘它所代表的值的范围,但至少我认为它对于新手来说比双重转义字符更具可读性。 \\d(虽然在某些时候你会厌倦输入额外的字符:D)。

有关这些“特殊”字符串的完整列表以及有关R中正则表达式的其他有用信息,我建议您从R基础文档中查看this link