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
而不是 df
(df
是 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
我有一个制表符分隔的文件:
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
而不是 df
(df
是 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