从R中的系统基质中熔化下半部分

时间:2017-07-28 13:12:05

标签: r

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

> 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 

这样做的优雅方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以将底部或上半部分的值更改为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

答案 1 :(得分:1)

由于'x'已经分配并且melt已经编辑,我们可以在sort数据集子集{1}后逐行获取非重复行的逻辑索引。然后用它来对行进行子集

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