繁体   English   中英

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

[英]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' 和 'Var2' 的值对行进行subset

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM