在 R 中按行名(有条件地)过滤矩阵

Filter a matrix by rownames (conditionally) in R

假设你有这个矩阵:

> dput(b)
structure(c(8.428852043462e-16, 0.98006786315672, 0.0636247563553075, 
-0.246858810409958, -1.37811970502942, -0.281625554642936, -8.91350446654785e-16, 
-0.305283565399869, -1.00802628192793, 0.14027577547337, -1.66288850621351, 
0.16259170026583, -1.3280185195633e-15, 0.278629912397198, -0.188868484543887, 
1.0533053295465, 1.16670767240438, -0.48819960367166), .Dim = c(6L, 
3L), .Dimnames = list(c("(Intercept)", "F_slowPC1", "F_slowPC2", 
"F_slowPC3", "data_yFYFF", "data_yPUNEW"), c("PC1", "PC2", "PC3"
)))

我只想获取以“data_y”字符串开头的行。

我试图用一个逻辑条件过滤它:

stingr::str_detect(rownames(b), "data_y")
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE

所以我尝试了

b[rownames(b) %in% str_detect(rownames(b),"data_y")==T]

但这让我很感动 Numeric(0)

如何获取包含“data_y”的所有行?

我不想将此矩阵转换为数据框。

你只需要

b[stringr::str_detect(rownames(b), "data_y"), ]

在您的函数后添加一个 , 以在行上指定您 select。

一个可能的解决方案,基于 tidyverse 之前将数据转换为数据帧:

library(tidyverse)

df %>% as.data.frame %>% 
  rownames_to_column("coefficients") %>% 
  filter(str_detect(coefficients, "^data_y"))

#>   coefficients        PC1        PC2        PC3
#> 1   data_yFYFF -1.3781197 -1.6628885  1.1667077
#> 2  data_yPUNEW -0.2816256  0.1625917 -0.4881996

使用b[i, ] 对行进行子集化。 b[i] 对由 i 索引的 as.vector(b) 的元素进行子集化,这不是您想要的。

你不需要stringr来构造i,因为基数R有startsWithgrep。这些语句中的任何一个都有效:

b[startsWith(rownames(b), "data_y"), , drop = FALSE]
b[grep("^data_y", rownames(b)), , drop = FALSE]

drop = FALSE 保证矩阵结果。默认情况下,如果只有一行被索引,则结果是一个无量纲向量。您可以比较 b[1, ]b[1, , drop = FALSE] 以了解我的意思。

data.table的另一个选项:

library(data.table)
bt <- as.data.table(b, keep.rownames = TRUE)

bt[like(rn,"data_y")]

#            rn        PC1        PC2        PC3
#1:  data_yFYFF -1.3781197 -1.6628885  1.1667077
#2: data_yPUNEW -0.2816256  0.1625917 -0.4881996

*注意:这可以在一行中完成,但如果您不想更改原始数据框,则选择创建数据 table 而不是使用 setDT