我有一个包含列名和行名的数据,其中包含一个从 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 到 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
关于r - 使用 grepl 匹配具有一个特定数字的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440549/