Использование 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. Что я могу сделать, чтобы решить эту проблему? Я ценю любую помощь.

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
Другие вопросы по тегам