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")
给出矩阵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
推荐阅读
- python - Python:Tkinter:动态创建标签
- dart - Dart:这些方括号在构造函数中的作用是什么?
- javascript - 无法从 axios 请求访问上传的文件到 laravel
- javascript - GatsbyJS 中的 Socket IO 客户端不起作用
- wayland - 两个简单的韦斯顿示例有什么区别?
- awk - 如何在unix文件中查找两个时间戳之间的行
- instagram - 过滤器在 Spark AR 模拟器中有效,但在应用程序中无效?
- python - 在python中将字符串从txt文件转换为数组
- node.js - 从 Angular 向 Node js API 发出 HTTP 请求的正确方法是什么?
- import - Isabelle 可以在名称中有空格的目录中导入文件吗?