【问题标题】:How to keep lower triangle plus diagonal in r如何在r中保持下三角形加对角线
【发布时间】:2020-07-17 18:16:39
【问题描述】:

我有一个如下所示的矩阵:

diag <- rep("Free",5)
offdiag <- rep("0.0", 5*6/2 )
m <- matrix(NA, ncol = length(diag), nrow = length(diag))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- diag
m
     [,1]   [,2]   [,3]   [,4]   [,5]  
[1,] "Free" "0.0"  "0.0"  "0.0"  "0.0" 
[2,] "0.0"  "Free" "0.0"  "0.0"  "0.0" 
[3,] "0.0"  "0.0"  "Free" "0.0"  "0.0" 
[4,] "0.0"  "0.0"  "0.0"  "Free" "0.0" 
[5,] "0.0"  "0.0"  "0.0"  "0.0"  "Free"

我想保留下三角形加上对角线元素,如下所示,在每个值后添加逗号 (,),最后添加 ;。可以在下面制作吗?

              Free, 
              0.0, Free, 
              0.0, 0.0, Free, 
              0.0, 0.0, 0.0, Free, 
              0.0, 0.0, 0.0, 0.0, Free, 
              0.0, 0.0, 0.0, 0.0, 0.0, Free;

谢谢!

【问题讨论】:

  • offdiag 长度不同。您可以将上对角线设置为"",即m[upper.tri(m)] &lt;- ""
  • 关于预期输出。是矩阵输出还是字符串
  • 或许,你可能需要apply(m, 1, function(x) toString(x[seq_len(match("Free", x))]))

标签: r matrix


【解决方案1】:

我们可以循环遍历行,paste 直到 'Free' 的元素,然后将其写入带有 cat 的文件

cat(paste0(paste(apply(m, 1, function(x) 
    toString(x[seq_len(match("Free", x))])), 
          collapse=",\n"), ";"), file = 'file1.txt')

-输出


或者用lower.tri提取元素并用pastetapply做一个组

cat(paste0(paste(tapply(m[lower.tri(m, diag = TRUE)], 
   row(m)[lower.tri(m, diag = TRUE)], FUN = toString), 
      collapse=",\n"), ";"), file = 'file1.txt')

数据

m <- structure(c("Free", "0.0", "0.0", "0.0", "0.0", "0.0", "Free", 
"0.0", "0.0", "0.0", "0.0", "0.0", "Free", "0.0", "0.0", "0.0", 
"0.0", "0.0", "Free", "0.0", "0.0", "0.0", "0.0", "0.0", "Free"
), .Dim = c(5L, 5L), .Dimnames = list(NULL, NULL))

【讨论】:

  • 感谢您的建议。如何将其保留为一个字符串变量?
  • @amisos55 只需删除末尾的catcat 用于写入文件或在未指定 file 时打印到控制台
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2020-02-25
  • 1970-01-01
  • 2013-01-04
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多