【问题标题】:Replace matrix elements based on column and row names根据列名和行名替换矩阵元素
【发布时间】:2018-05-06 15:16:31
【问题描述】:

我有一个带有数值的元素矩阵,例如:

> mtx <- as.matrix(read.csv("matrix.csv", header = TRUE, row.names = 1,sep = ","))
> head(mtx)

     BE   BG   EE   ES   FI
BE 0.00 0.75 0.17 0.28 0.48
BG 0.75 0.00 0.92 1.03 1.24
EE 0.17 0.92 0.00 0.11 0.31
ES 0.28 1.03 0.11 0.00 0.20

我想根据列和行的名称将某些元素中的值替换为零。即,当列“BE”与行“ES”相交时,我希望为零,反之亦然,即当列“ES”与行“BE”相交时,所以我想得到:

     BE   BG   EE   ES   FI 
BE 0.00 0.75 0.17 0.00 0.00 
BG 0.75 0.00 0.92 1.03 1.24 
EE 0.17 0.92 0.00 0.11 0.31 
ES 0.00 1.03 0.11 0.00 0.00

我必须对许多矩阵执行此操作,这些矩阵比此示例大,因此需要替换 >150 对。这是data structure。需要更换: c('BE', 'FI', 'FR', 'DE', 'IE', 'NL', 'NO', 'SE', 'CH', 'GB', 'DK','PT','ES')

我找到了函数replace,但它显然只基于应用于值的标准,而不是包含它们的元素的行和列的名称...

【问题讨论】:

  • 试试mtx[c("BE", "ES"), c("ES", "BE")] &lt;- 0
  • 或使用矩阵索引:mtx[rbind(c("BE", "ES"), c("ES", "BE"))] &lt;- 0。看看?"[",值得看两三遍。
  • 谢谢!问题是有数百个这样的对,这就是为什么我正在寻找可以自动化它的东西
  • 通常,人们会要求您提供一个可重现的示例来说明您的问题。在这里,您应该在 mtx 上使用 dput 并将结果粘贴到您的问题中。其次,您应该通过在您的问题文本中提及它或者通过在您的示例中添加第二对来包含附加信息。查看?ncomb。这可能会有所帮助。还有expand.grid。目前尚不清楚您的数百对数据结构是什么,因此您也应该在问题中提供此信息。
  • 谢谢,我已经相应地调整了问题

标签: r matrix replace


【解决方案1】:

由于对角线为零,我们可以对行/列进行子集化并将其分配给 0

 mtx[c("BE", "ES"), c("ES", "BE")] <- 0 

【讨论】:

    【解决方案2】:

    akrun 的回答很棒。我在这里添加了我的解决方案,希望对您有所帮助。

    可以通过将行名和列名过滤为一组名称来操作矩阵。

    例如:

    a=matrix(1:9,3,3)
    dimnames(a) <- list(c("x","y","z"),c("x","y","z"))
    a[(rownames(a) %in% c("a")), colnames(a) %in% c("d")] <- 0
    

    但我认为您希望在某些对角线位置为零;所以解决方案是:

    a <- matrix(1:9,3,3)
    dimnames(a) <- list(c("x","y","z"),c("x","y","z"))
    
    rows <- c("x","z")
    ind <- which(rownames(a) %in% rows)
    
    diag(a)[ind] <- 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2021-06-22
      • 2020-07-14
      相关资源
      最近更新 更多