R 通过部分匹配的行名进行子集化

R subsetting by partially matching row name

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

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

我只想 select 行名称以 BN4 开头的行,输出如下:

row.names c1 c2 c3
BN4 9 1 2 
BN8 4 6 8

如果我知道向量中的确切行名,我知道我将如何解决问题...

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

但是我如何通过查找以 'BN' 开头的行并对其进行子集化来解决问题?

您可以使用 grep 查找名称以 "BN" 开头的行。

对对象使用 x 而不是 dfdf 是 R 中的一个函数):

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

尝试在 grepl

中使用正则表达式
df[grepl("BN\d{1}", row.names(df), ]

如果您更喜欢描述性更强的函数,您可以使用 stringr

做同样的事情
df[str_detect(row.names(df), "BN\d{1}"), ]

要注意的是,这些调用将选取字符串中任意位置具有 BN[digit] 的三个字符匹配项的任何行。像 XYBN9L 这样的东西会被拾取。

您可以使用 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