【问题标题】:Subsetting matrices of different dimensions不同维度的子集矩阵
【发布时间】:2023-06-09 04:46:02
【问题描述】:

假设我有两个不同维度的相似矩阵,它们的一些row.names 相同但顺序不同,例如:

> m1
            red   yellow     blue    green    black
red    0.000000 2.236068 4.472136 6.708204 8.944272
yellow 2.236068 0.000000 2.236068 4.472136 6.708204
blue   4.472136 2.236068 0.000000 2.236068 4.472136
green  6.708204 4.472136 2.236068 0.000000 2.236068
black  8.944272 6.708204 4.472136 2.236068 0.000000

> m2
         purple    green     blue     red
purple 0.000000 0.081172 4.472136 6.708204
green  0.081172 0.000000 0.107647 4.472136
blue   4.472136 0.107647 0.000000 0.073217
red    6.708204 4.472136 0.073217 0.000000

我想将m1 子集化为一个仅包含与m2 相同的行的新矩阵。最终结果应如下所示:

> m3
            red      blue    green    
red    0.000000  4.472136 6.708204 
blue   4.472136  0.000000 2.236068 
green  6.708204  2.236068 0.000000 

请注意,在“真实”数据中,矩阵有数百个维度。 subset 命令似乎是用于参考自身的子集数据,而不是参考其他数据帧或矩阵?无论如何,我尝试像这样创建匹配索引:

index <- m1 %in% m2 

这很好,但是在尝试使用 cbind 或 for 循环将此对象转换为新矩阵时出现错误。我知道必须有一种相当快速或优雅的方式来做到这一点,但是关于这个主题的文档似乎有点简洁。理想情况下,在将m1 转换为m3 之后,我想对m2m3 的匹配元素中的值执行一些基本的算术运算,例如 m2(2,3) - m3(3,2) = -2.128421。希望这是有道理的。

提前非常感谢!!

【问题讨论】:

  • +1 表示有预期输出的明确问题

标签: r matrix similarity


【解决方案1】:
  m3<-m1[row.names(m1) %in% row.names(m2),]
               red   yellow     blue    green    black
    red   0.000000 2.236068 4.472136 6.708204 8.944272
    blue  4.472136 2.236068 0.000000 2.236068 4.472136
    green 6.708204 4.472136 2.236068 0.000000 2.236068


     m3[,rownames(m3)]
           red     blue    green
red   0.000000 4.472136 6.708204
blue  4.472136 0.000000 2.236068
green 6.708204 2.236068 0.000000

【讨论】:

  • 完美!非常感谢。
  • @amurphy :如果这是您正在寻找的内容,您可能需要检查答案是否已接受
【解决方案2】:

试试merge(m1,m2,all.x=FALSE,all.y=TRUE,by="colorrow")。首先必须将每个矩阵的行名放入名为colorrow 的列中。

【讨论】: