如果行名和列名部分匹配,则提取矩阵的行和列

Extracting rows and columns of a matrix if row names and column names have a partial match

我将使用较小的矩阵举例说明我的问题。假设我有一个包含行名和列名的矩阵,如下所示:

set.seed(10)

a <- matrix(rexp(200), ncol=9,nrow = 3)
colnames(a) <- paste(rep(c("aaa" , "bbb" , "ccc") , each = 3) , rep(c(1:3) , times = 3) , sep = "")
rownames(a) <- c("aaa" , "bbb" , "ccc")

给出矩阵a:

          aaa1      aaa2      aaa3      bbb1      bbb2       bbb3      ccc1      ccc2      ccc3
aaa 0.01495641 1.5750419 2.3276229 0.6722683 1.3165471 1.63298388 1.7447187 0.3469224 1.3981074
bbb 0.92022120 0.2316586 0.7291238 0.4265298 0.4132938 0.07119408 0.2929501 0.7950826 1.1104594
ccc 0.75215894 1.0866730 1.2883101 1.1154219 0.6765753 2.56885161 0.6453052 1.3962992 0.1704216

我想找到一个有效的代码,将行名称与每个列名称匹配而不带数字,返回一个向量。在这种情况下:

      aaa1       aaa2       aaa3       bbb1       bbb2       bbb3       ccc1       ccc2       ccc3 
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160 

我使用这段代码获得了之前的矩阵:

b <- c(a[grepl("aaa" , rownames(a)) , grepl("aaa" , colnames(a))] ,
       a[grepl("bbb" , rownames(a)) , grepl("bbb" , colnames(a))] ,
       a[grepl("ccc" , rownames(a)) , grepl("ccc" , colnames(a))] )

有没有办法有效地做到这一点,即使矩阵大得多并且可能具有与此不同的名称结构?

一个更简单的选择是通过从 table 转换为 data.frame 来重塑为 'long',然后根据 'Var1' 的值 subset 行] 和 'Var2'

out <- subset(as.data.frame.table(a), Var1 == sub("\d+", "", Var2),
     select =c(Var2, Freq))
with(out, setNames(Freq, Var2))
    aaa1       aaa2       aaa3       bbb1       bbb2       bbb3       ccc1       ccc2       ccc3 
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160 

或使用 row/column 索引

i1 <- match( sub("\d+", "", colnames(a)), rownames(a))
a[cbind(i1, seq_along(i1))]
[1] 0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160