按部分匹配行名进行R子集。

3

我有一个制表符分隔的文件:

row.names c1 c2 c3
AF3 0 2 4
BN4 9 1 2 
AF2 8 7 1
BN8 4 6 8

我希望筛选出只有行名以 BN4 开头的行,输出结果如下:
row.names c1 c2 c3
BN4 9 1 2 
BN8 4 6 8

如果我知道一个向量中确切的行名称,我就知道如何解决这个问题...

df[row.names(df) %in% c('BN4','BN8'), ]

但是我如何通过查找和子集化以'B N'开头的行来解决问题呢?


我认为“以BN4开头的名称”是一个打字错误。 - Matthew Lundberg
3个回答

5

你可以使用 grep 命令来查找那些以“BN”开头的行。

将对象名称从 df 改为 xdf 是 R 语言中的一个函数):

x[grep("^BN", row.names(x)),]
##     c1 c2 c3
## BN4  9  1  2
## BN8  4  6  8

2
您可以使用dplyr中的slice()函数。
library(dplyr)
df %>% slice(grep("^BN", row.names(.)))

这将会得到:

#  c1 c2 c3
#1  9  1  2
#2  4  6  8

这里,行名称被静默地删除了。为了保留它们,您可以通过使用add_rownames()转换为显式变量:

df %>% add_rownames() %>% slice(grep("^BN", rowname))

或者使用filter()

df %>% add_rownames() %>% filter(grepl("^BN", rowname))

您将获得:

#  rowname c1 c2 c3
#1     BN4  9  1  2
#2     BN8  4  6  8

0

尝试使用正则表达式和grepl

df[grepl("BN\\d{1}", row.names(df), ]

如果您更喜欢一些更具描述性的函数,您可以使用 stringr 包来完成同样的事情。

df[str_detect(row.names(df), "BN\\d{1}"), ]

问题在于这些调用将拾取任何字符串中具有BN [数字]的三个字符匹配项的行。例如,像XYBN9L这样的字符串将被拾取。


1
如何修复这个“catch”? - Matthew Lundberg
如果你真的只需要前两个字符,你可以尝试 substr(row.names(df), 1, 2) == "BN"substr 将从行名称中仅提取前两个字母。我相信有一个正则表达式只会查看前两个字母,但是我在正则表达式方面的能力仅限于基础。 - Benjamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接