我有一个数据框,想要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模式的帮助。一个限制是我不想更改任何列名。
答案 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。