首页 > 解决方案 > 使用 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")

给出矩阵a

       aaa1 bbb1 abc11 ccc100
aaa1      1    2     3      4
bbb1      5    6     7      8
abc11     9   10    11     12
ccc100   13   14    15     16

我想选择包含“1”但没有其他内容的行和列。像这样:

     aaa1 bbb1
aaa1    1    2
bbb1    5    6 

但是当我使用:

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

我再次得到矩阵a。我尝试使用“^1”,但它当然找不到任何正好是 1 的名称。我能做些什么来解决这个问题?我很感激任何帮助。

标签: rgrepl

解决方案


编辑

正如问题中更新的那样,数字从 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

推荐阅读