【问题标题】:Matching rownames with a string contained within a column将行名与列中包含的字符串匹配
【发布时间】:2020-11-18 16:58:41
【问题描述】:

我很难找到一个有效的代码来匹配矩阵中的行和列,并生成一个包含所有匹配项的新向量。

我有一个非常大的矩阵。例如,假设有一个称为“测试”的矩阵,如下所示:

row <- c("aaa" , "bbb" , "ccc")
column <- paste(rep(row, each = 3) , rep(c(1:3) , times = 3) , sep = "_")

test <- matrix(rexp(90), nrow = 3 , ncol = 9)

colnames(test) <- column
rownames(test) <- row

在我的例子中,这给出了矩阵test:

         aaa_1     aaa_2     aaa_3     bbb_1      bbb_2     bbb_3     ccc_1     ccc_2      ccc_3
aaa 0.08695083 0.5360101 0.2151808 0.2623833 0.05368126 3.5040455 0.3966199 1.1790225 0.16178868
bbb 0.26399994 0.2753358 0.3457663 2.1826606 0.73636302 0.8346718 0.9535214 0.4230223 1.59374844
ccc 0.84269411 0.1526342 0.5687740 0.7493685 0.68945927 2.7006906 0.6448158 1.0599139 0.05998212

所以我想创建一个名为test1 的新向量,它匹配具有相同字符串列的行。就我而言,我可以使用:

test1 <- c(test[grep("aaa" , rownames(test)) , grep("aaa" , colnames(test))] , 
           test[grep("bbb" , rownames(test)) , grep("bbb" , colnames(test))] ,
           test[grep("ccc" , rownames(test)) , grep("ccc", colnames(test))])

names(test1) <- column

这会给我:

     aaa_1      aaa_2      aaa_3      bbb_1      bbb_2      bbb_3      ccc_1      ccc_2 
0.08695083 0.53601009 0.21518077 2.18266063 0.73636302 0.83467182 0.64481582 1.05991387 
     ccc_3 
0.05998212 

但是如果我有一个巨大的矩阵和向量,这段代码就很糟糕。有没有更有效的方法来做到这一点?

另外,在这个例子中,有一个由三个字符组成的字符串,但在我的矩阵中,有不同长度的字符串。感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项可能是:

    test[t(sapply(rownames(test), grepl, colnames(test)))]
    

    【讨论】:

      【解决方案2】:

      我们可以将table 属性添加到matrix,使用as.data.frame 转换为长格式,使用subset 子集元素并使用setNames 转换为命名向量

      with(subset(as.data.frame.table(test), sub("_\\d+", "", Var2) ==
               Var1, select = 2:3), setNames(Freq, Var2))
      

      -输出

      #   aaa_1     aaa_2     aaa_3     bbb_1     bbb_2     bbb_3     ccc_1     ccc_2     ccc_3 
      #1.6563422 3.1174159 3.5855340 0.3218447 0.5638403 2.7593073 0.1595813 0.2933381 0.4131952 
      

      注意:值不同,因为没有 set.seed

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-02
        • 2020-12-25
        • 2021-12-09
        • 2019-04-24
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 2013-10-23
        相关资源
        最近更新 更多