将分组矩阵的上三角设置为0

时间:2019-04-22 19:17:48

标签: r

我正在计算向量元素之间的差异。因此,我得到一个差矩阵作为输出。

但是,我想按组$ j $计算这些成对差异。因此,如果我要计算整个矢量的差异,那么其中只有几个差异是相关的,我想用“ NA”代替不相关的那些。

这是一个综合示例:

set.seed(1)

length.k <- 4
length.j <- 3

dimensions<-length.j*length.k
m <- matrix(sample(1:100, dimensions), ncol=1)

m.diff <- data.frame(abs(outer(m,m,'-')))


m.diff[5:12,1:4] <- NA
m.diff[1:4,5:12] <- NA

m.diff[9:12,5:8] <- NA

m.diff[5:8,9:12] <- NA

Desired output:
          X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
     [1,]  0 10 30 62 NA NA NA NA NA  NA  NA  NA
     [2,] 10  0 20 52 NA NA NA NA NA  NA  NA  NA
     [3,] 30 20  0 32 NA NA NA NA NA  NA  NA  NA
     [4,] 62 52 32  0 NA NA NA NA NA  NA  NA  NA
     [5,] NA NA NA NA  0 66 77 42 NA  NA  NA  NA
     [6,] NA NA NA NA 66  0 11 24 NA  NA  NA  NA
     [7,] NA NA NA NA 77 11  0 35 NA  NA  NA  NA
     [8,] NA NA NA NA 42 24 35  0 NA  NA  NA  NA
     [9,] NA NA NA NA NA NA NA NA  0  52  39  42
    [10,] NA NA NA NA NA NA NA NA 52   0  13  10
    [11,] NA NA NA NA NA NA NA NA 39  13   0   3
    [12,] NA NA NA NA NA NA NA NA 42  10   3   0

如果有一种方法可以直接使用dplyr或其他软件包按组计算成对差异。我也很高兴知道如何做。我有一列包含j个值,另一列包含k个值以形成j * k组合。

谢谢。

编辑:

我取得了一些进展,我设法只保留了相关的差异。但是,我想将按j分组的每个矩阵的上三角设置为零。

这里是我的代码,

```{r}
library(dplyr)
library(tidyr)
library(reshape2)

set.seed(1)

length.k <- 4
length.j <- 3

dimensions<-length.j*length.k
mval <- matrix(sample(1:100, dimensions), ncol=1)

j<-seq(1:length.j)
k<-seq(1:length.k)

jk<-expand.grid(j,k)
colnames(jk)<-c("j","k")
m<-data.frame(jk,mval) %>% arrange(j)


m2 <- m %>% group_by(j) %>% tidyr::expand(crossing(mval, mval)) %>%
#correction of supressed k column
ungroup() %>%  dplyr::mutate(k=rep(k,length(jk$j))) %>% select("j","k",everything()) %>% 
#computation of differences
dplyr::mutate(difference=abs(mval-mval1)) %>% 
group_by(j,k) %>% mutate(kdiff=sequence(n())) %>% 
ungroup() %>% 
dcast(j+k~kdiff,value.var = "difference") 

结果:

      j k   1  2  3  4
 [1,] 1 1   0 21 83 91
 [2,] 1 2  21  0 62 70
 [3,] 1 3  83 62  0  8
 [4,] 1 4  91 70  8  0

 [5,] 2 1   0  1 18 43
 [6,] 2 2   1  0 17 42
 [7,] 2 3  18 17  0 25
 [8,] 2 4  43 42 25  0

 [9,] 3 1   0 41 42 70
[10,] 3 2  41  0  1 29
[11,] 3 3  42  1  0 28
[12,] 3 4  70 29 28  0

我想要什么:

      j k   1  2  3  4
 [1,] 1 1   0  0  0  0
 [2,] 1 2  21  0  0  0
 [3,] 1 3  83 62  0  0
 [4,] 1 4  91 70  8  0

 [5,] 2 1   0  0  0  0
 [6,] 2 2   1  0  0  0
 [7,] 2 3  18 17  0  0
 [8,] 2 4  43 42 25  0

 [9,] 3 1   0  0  0  0
[10,] 3 2  41  0  0  0
[11,] 3 3  42  1  0  0
[12,] 3 4  70 29 28  0

0 个答案:

没有答案