【问题标题】:melt the lower half from systematic matrix in R融化R中系统矩阵的下半部分
【发布时间】:2017-07-28 13:12:05
【问题描述】:

鉴于我有一个三乘三系统矩阵。

> x<-matrix(1:9,3)
> x[lower.tri(x)] = t(x)[lower.tri(x)]
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    4    5    8
[3,]    7    8    9

然后我应用库reshape2 使其成为长格式。

> library(reshape2)
> x <- melt(x)
> x
  Var1 Var2 value
1    1    1     1
2    2    1     4
3    3    1     7
4    1    2     4
5    2    2     5
6    3    2     8
7    1    3     7
8    2    3     8
9    3    3     9

由于上对角线和下对角线相同,我只需要一半的结果,如下所示。

Var1 Var2 value
   1    1     1
   2    1     4
   3    1     7
   2    2     5
   3    2     8
   3    3     9 

有什么优雅的方法可以做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以将下半部分或上半部分的值更改为 NA,然后 melt 忽略缺失值,假设矩阵中最初没有缺失值,或者如果存在则不需要将它们保留在结果中是:

    x[upper.tri(x)] = NA
    reshape2::melt(x, na.rm=T)
    
    #  Var1 Var2 value
    #1    1    1     1
    #2    2    1     4
    #3    3    1     7
    #5    2    2     5
    #6    3    2     8
    #9    3    3     9
    

    【讨论】:

    • 或者更令人困惑的版本:reshape2::melt(`is.na&lt;-`(x, upper.tri(x)), na.rm = TRUE)x %&gt;% `is.na&lt;-`(upper.tri(.)) %&gt;% melt(na.rm = TRUE) 用于吹笛者。这种方式保留了x,这是值得的。
    【解决方案2】:

    由于 'x' 已经分配并且melted,我们可以在sorting 数据集子集的第一列和第二列之后获得非重复行的逻辑索引,然后将其用于子集的行

    x[!duplicated(t(apply(x[1:2], 1, sort))),]
    #     Var1 Var2 value
    #1    1    1     1
    #2    2    1     4
    #3    3    1     7
    #5    2    2     5
    #6    3    2     8
    #9    3    3     9
    

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2018-08-08
      • 2021-09-16
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多