Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中熔化系统基质的下半部分_R - Fatal编程技术网

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

在R中熔化系统基质的下半部分,r,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 由于上对角线和下对角线是相同的,我只需要结果的一半,如下所示 Var1 Var2 value 1 1 1 2 1 4

假设我有一个三乘三的系统矩阵

> 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
由于上对角线和下对角线是相同的,我只需要结果的一半,如下所示

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

任何优雅的方法都可以做到这一点吗?

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

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

由于已经分配了“x”并
melt
ed,我们可以在
对数据集的子集进行排序后,获得非重复行的逻辑索引,然后使用它对行进行子集划分

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

或者更令人困惑的版本:
reformae2::melt(`is.na%`is.na%melt(na.rm=TRUE)
用于吹笛者。这种方式保留了
x
,这是值得的。
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