在 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有startsWith
和grep
。这些语句中的任何一个都有效:
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
。
假设你有这个矩阵:
> 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有startsWith
和grep
。这些语句中的任何一个都有效:
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
。