我有一个制表符分隔文件:
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'
开头的行来解决问题?答案 0 :(得分:3)
您可以使用grep
查找名称以" BN"开头的行。
使用x
作为对象而不是df
(df
是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这样的东西会被拿起来。