在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