Установите верхний треугольник сгруппированной матрицы на 0 - PullRequest
0 голосов
/ 22 апреля 2019

Я вычисляю различия между элементами вектора.Следовательно, я получаю матрицу различий в качестве вывода.

Однако я бы хотел вычислить эти попарные разности по группе $ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...