我正在计算向量元素之间的差异。因此,我得到一个差矩阵作为输出。
但是,我想按组$ 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