Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.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_Matrix_Melt - Fatal编程技术网

R 熔化后强制将矩阵中的上三角值转换为下三角值

R 熔化后强制将矩阵中的上三角值转换为下三角值,r,matrix,melt,R,Matrix,Melt,我有矩阵 m = matrix(c(0,-1,-2,-3,1,0,-4,-5,2,4,0,-6,3,5,6,0),4,4) m 一开始是不对称的 [,1] [,2] [,3] [,4] [1,] 0 1 2 3 [2,] -1 0 4 5 [3,] -2 -4 0 6 [4,] -3 -5 -6 0 我需要先把它融化 mm = melt(m) 只有在这之后,我才想替换较低的三角形值 > mm

我有矩阵

m = matrix(c(0,-1,-2,-3,1,0,-4,-5,2,4,0,-6,3,5,6,0),4,4)
m
一开始是不对称的

     [,1] [,2] [,3] [,4]
[1,]    0    1    2    3
[2,]   -1    0    4    5
[3,]   -2   -4    0    6
[4,]   -3   -5   -6    0
我需要先把它融化

mm = melt(m)
只有在这之后,我才想替换较低的三角形值

> mm[melt(lower.tri(m))['value']==TRUE,]

   Var1 Var2 value
2     2    1    -1
3     3    1    -2
4     4    1    -3
7     3    2    -4
8     4    2    -5
12    4    3    -6
> mm[melt(upper.tri(m))['value']==TRUE,]

   Var1 Var2 value
5     1    2     1
9     1    3     2
10    2    3     4
13    1    4     3
14    2    4     5
15    3    4     6
具有上三角形值

> mm[melt(lower.tri(m))['value']==TRUE,]

   Var1 Var2 value
2     2    1    -1
3     3    1    -2
4     4    1    -3
7     3    2    -4
8     4    2    -5
12    4    3    -6
> mm[melt(upper.tri(m))['value']==TRUE,]

   Var1 Var2 value
5     1    2     1
9     1    3     2
10    2    3     4
13    1    4     3
14    2    4     5
15    3    4     6
我试过了

mm[melt(lower.tri(m))['value']==TRUE,'value'] = mm[melt(upper.tri(m))['value']==TRUE,'value']
但是结果呢

> mm
   Var1 Var2 value
1     1    1     0
2     2    1     1
3     3    1     2
4     4    1     4
5     1    2     1
6     2    2     0
7     3    2     3
8     4    2     5
9     1    3     2
10    2    3     4
11    3    3     0
12    4    3     6
13    1    4     3
14    2    4     5
15    3    4     6
16    4    4     0
对于这两个值对来说是不对称的

   Var1 Var2 value
4     4    1     4
13    1    4     3

   Var1 Var2 value
7     3    2     3
10    2    3     4

通过将上三角值复制到下三角值,是否有一种漂亮的方法使
melt
后的矩阵对称?

使用下三角的
Var2
(列索引)将小于
Var1
(行索引)

mm$value2=sapply(1:NROW(mm),函数(i){
if(mm$Var2[i]-mm$Var1[i]<0){
mm$value[i]=mm$value[mm$Var1==mm$Var2[i]&mm$Var2==mm$Var1[i]]
}否则{
mm$价值[i]
}
})
嗯
#Var1 Var2值2
#1     1    1     0      0
#2     2    1    -1      1
#3     3    1    -2      2
#4     4    1    -3      3
#5     1    2     1      1
#6     2    2     0      0
#7     3    2    -4      4
#8     4    2    -5      5
#9     1    3     2      2
#10    2    3     4      4
#11    3    3     0      0
#12    4    3    -6      6
#13    1    4     3      3
#14    2    4     5      5
#15    3    4     6      6
#16    4    4     0      0

如果我们利用
match
产生未排序的值这一事实,与%中的
%相比,我们可以使这一点简短而甜蜜。我们使用转置的
m
upper.tri
,而不是
m
lower.tri
,以避免排序问题

mm$value[match(t(m)[which(upper.tri(m))], mm$value)] <- m[which(upper.tri(t(m)))]
看起来很对称


数据


你必须融化吗?请参阅或@thelatemail After
melt
I向熔融矩阵添加更多列。然后,我在矩阵上绘制一个
ggplot
,并使用一列表示瓷砖颜色,另一列表示瓷砖内部的文本。我花了一段时间才识别出这种语法
t(m)[which(upper.tri(m))]
。它看起来确实很甜。
m <- structure(c(0, -1, -2, -3, 1, 0, -4, -5, 2, 4, 0, -6, 3, 5, 6, 0), .Dim = c(4L, 4L))
mm <- data.table::melt(m)