【问题标题】:melt the lower half matrix in R熔化R中的下半部分矩阵
【发布时间】:2012-01-03 12:45:21
【问题描述】:

如何融化下半边三角形加对角矩阵?

11 NA NA  NA  NA
12 22 NA  NA  NA
13 23 33  NA  NA
14 24 34  44  NA
15 25 35  45  55
    A <- t(matrix (c(11,  NA, NA,  NA,  NA, 12, 22, NA,  NA,  NA,
   13, 23, 33,  NA,  NA, 14, 24, 34,  44,  NA,15, 25, 
   35,  45,  55), ncol = 5)) 

 > A
     [,1] [,2] [,3] [,4] [,5]
[1,]   11   NA   NA   NA   NA
[2,]   12   22   NA   NA   NA
[3,]   13   23   33   NA   NA
[4,]   14   24   34   44   NA
[5,]   15   25   35   45   55 

到data.frame in row and col(保持以下顺序)

col  row   value 
1     1      11
1     2      12
1     3      13
1     4      14
1     5      15
2     2      22
2     3      23
2     4      24
2     5      25
3     3      33
3     4      34
3     5      35
4     4      44
4     5      45
5     5      55

【问题讨论】:

    标签: r matrix reshape


    【解决方案1】:

    如果您也希望索引作为列,这应该可以:

    m <- matrix(1:25,5,5)
    m[upper.tri(m)] <- NA
    m
    
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1   NA   NA   NA   NA
    [2,]    2    7   NA   NA   NA
    [3,]    3    8   13   NA   NA
    [4,]    4    9   14   19   NA
    [5,]    5   10   15   20   25
    
    cbind(which(!is.na(m),arr.ind = TRUE),na.omit(as.vector(m)))
          row col   
     [1,]   1   1  1
     [2,]   2   1  2
     [3,]   3   1  3
     [4,]   4   1  4
     [5,]   5   1  5
     [6,]   2   2  7
     [7,]   3   2  8
     [8,]   4   2  9
     [9,]   5   2 10
    [10,]   3   3 13
    [11,]   4   3 14
    [12,]   5   3 15
    [13,]   4   4 19
    [14,]   5   4 20
    [15,]   5   5 25
    

    我想我会稍微解释一下。我正在使用三个“技巧”:

    1. whicharr.ind 参数以获取索引
    2. 非常有用的 na.omit 函数可以避免一些额外的输入
    3. 事实上,R 以列主格式存储矩阵,因此as.vector 以正确的顺序返回值。

    【讨论】:

    • 感谢这是一个很好的解决方案 - 我们如何在行内做列(即当行级别为 1 1 1 1....时,列将是 1 2 3 4 ...)跨度>
    • 如果我理解你的意思,我认为同样的解决方案也有效,但你必须对结果进行排序,才能按你想要的顺序列出它们。
    【解决方案2】:

    我的一个班轮。

    reshape2::melt(A, varnames = c('row', 'col'), na.rm = TRUE)
    

    【讨论】:

    • 一种变体B &lt;- melt(A, varnames = c('row', 'col'))B[!is.na(B$value),]
    • 这个解决方案不符合问题的要求。它转换整个矩阵,而不仅仅是下三角形。
    【解决方案3】:

    这是我的第一个解决方案:

    test <- rbind(c(11,NA,NA,NA,NA),
      c(12,22,NA,NA,NA),
      c(13,23,33,NA,NA),
      c(14,24,34,44,NA),
      c(15,25,35,45,55))  ## Load the matrix
    
    test2 <- as.vector(test)  ## "melt" it into a vector
    
    test <- cbind( test2[!is.na(test2)] )  ## get rid of NAs, cbind it into a column 
    

    结果是:

    > test
          [,1]
     [1,]   11
     [2,]   12
     [3,]   13
     [4,]   14
     [5,]   15
     [6,]   22
     [7,]   23
     [8,]   24
     [9,]   25
    [10,]   33
    [11,]   34
    [12,]   35
    [13,]   44
    [14,]   45
    [15,]   55
    

    或者,您可以使用矩阵命令:

    test <- rbind(c(11,NA,NA,NA,NA),
      c(12,22,NA,NA,NA),
      c(13,23,33,NA,NA),
      c(14,24,34,44,NA),
      c(15,25,35,45,55))  ## Load the matrix
    
    test2 <- matrix(test, ncol=1)  
    test <- cbind( test2[!is.na(test2), ] )   
      ## same as above, except now explicitly noting rows to replace.
    

    【讨论】:

    • 这不会返回列和行的索引。
    • 啊,抱歉;我没有意识到你想要所有这些作为结果。我认为这些只是为了帮助指示组件的顺序。一会儿……
    • 实际上最好的方法绝对是 @joran 的“which”命令。
    【解决方案4】:

    这是我的尝试:

    # enter the data
    df <- c(11,12,13,14,15,NA,22,23,24,25,NA,NA,33,34,35,NA,NA,NA,44,45,NA,NA,NA,NA,55)
    dim(df) <- c(5,5)
    df
    
    # make new data frame with rows and column indicators
    melteddf <- data.frame(
    value=df[lower.tri(df,diag=T)],
    col=rep(1:ncol(df),ncol(df):1),
    row=unlist(sapply(1:nrow(df),function(x) x:nrow(df)))
    )
    

    我希望我知道 cbind 的 arr.ind 部分,但在此之前。

    【讨论】:

      【解决方案5】:

      这是一种使用arrayInd 的方法,它与@joran 的基本相同,但在其他设置中可能有用:

      na.omit( data.frame(arrayInd(1:prod(dim(A)), dim(A)), value=c(A)) )
         X1 X2 value
      1   1  1    11
      2   2  1    12
      3   3  1    13
      4   4  1    14
      5   5  1    15
      7   2  2    22
      8   3  2    23
      9   4  2    24
      10  5  2    25
      13  3  3    33
      14  4  3    34
      15  5  3    35
      19  4  4    44
      20  5  4    45
      25  5  5    55
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 2021-09-16
        • 2014-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多