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

时间:2015-03-16 02:06:05

标签: r subset

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

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'), ]

但是,如何通过查找以' BN'

开头的行来解决问题?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可以使用slice()

中的dplyr
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

答案 2 :(得分:0)

尝试使用grepl

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

如果您更喜欢更具描述性的功能,可以使用stringr

执行相同的操作
df[str_detect(row.names(df), "BN\\d{1}"), ]

问题在于,这些调用将拾取字符串中任何位置具有BN [digit]三个字符匹配的行。像XYBN9L这样的东西会被拿起来。