使用grepl匹配具有一个特定编号的名称

使用grepl匹配具有一个特定编号的名称,r,grepl,R,Grepl,我有一个列名和行名的数据,它有一个数字从1到100的字符串 我使用grepl选择具有特定数字的名称(同时忽略字符串)。假设我有: a <- matrix(c(1:16), nrow = 4, byrow = TRUE) colnames(a) <- c("aaa1", "bbb1", "abc11", "ccc100") rownames(a) <- c("aaa1", "bbb1", "abc11", "ccc100") 我想选择包含“1”但不包含其他内容的行和列。像这样:

我有一个列名和行名的数据,它有一个数字从1到100的字符串

我使用grepl选择具有特定数字的名称(同时忽略字符串)。假设我有:

a <- matrix(c(1:16), nrow = 4, byrow = TRUE)
colnames(a) <- c("aaa1", "bbb1", "abc11", "ccc100")
rownames(a) <- c("aaa1", "bbb1", "abc11", "ccc100")
我想选择包含“1”但不包含其他内容的行和列。像这样:

     aaa1 bbb1
aaa1    1    2
bbb1    5    6 
但当我使用:

a[grepl("1" , rownames(a)) , grepl("1" , colnames(a))]
我再次得到矩阵
a
。我尝试使用“^1”,但它当然找不到任何正好是1的名称。我能做些什么来解决这个问题?非常感谢您的帮助。

编辑

正如问题中更新的,数字从1到100,我们只想提取正好是1的行和列。我们可以从行和列名中提取整个数字部分,然后只过滤那些正好等于1的部分

library(stringr)
a[str_extract(rownames(a), "[0-9]+") == 1, str_extract(colnames(a), "[0-9]+") == 1]

#     aaa1 bbb1
#aaa1    1    2
#bbb1    5    6

grepl
中继续相同的逻辑,我们可以更新正则表达式,并在字符串末尾查找后跟“1”的字符

a[grepl("[A-Za-z]1$", rownames(a)), grepl("[A-Za-z]1$", colnames(a))]

#     aaa1 bbb1
#aaa1    1    2
#bbb1    5    6

原始答案

使用“1$”表示以“1”结尾的字符串,然后您可以使用子集

a[grepl("1$",rownames(a)), grepl("1$",colnames(a))]

#     aaa1 bbb1
#aaa1    1    2
#bbb1    5    6
这相当于

a[endsWith(rownames(a), "1"), endsWith(colnames(a), "1")]

#     aaa1 bbb1
#aaa1    1    2
#bbb1    5    6

好的,它在这种情况下起作用。但是,当行和列名包括“21”时,例如,此代码将选择这些名称。是否有方法精确地找到“1”,而不管数字是多少?请参见!谢谢你的回答,并把我介绍给斯特林格
a[endsWith(rownames(a), "1"), endsWith(colnames(a), "1")]

#     aaa1 bbb1
#aaa1    1    2
#bbb1    5    6