Использование 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