鉴于我有一个三乘三的系统矩阵。
> 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
这样做的优雅方法是什么?
答案 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