Заполните матрицу со средней разницей между данными группы в R - PullRequest
0 голосов
/ 06 июня 2018

Я рассчитываю получить среднее абсолютное значение различий между столбцами фрейма данных (т. Е. 1. вычесть значения из одного столбца из другого столбца, 2. взять абсолютные значения этих различий и затем 3. взять среднееиз этих абсолютных значений).Затем я пытаюсь заполнить матрицу результатами, сравнивающими каждый столбец с каждым другим столбцом.

Например: у меня есть фрейм данных, который выглядит следующим образом

 df <- data.frame(m1=1:3, m2=1:3+1, m3=1:3+2)

Я ищучтобы получить такую ​​матрицу (где, например, столбец 2, строка 1 заполняется с результатом:

mean(abs(m2-m1))

и выглядит так:

       m1  m2  m3
    m1  0   1   2
    m2  1   0   1
    m3  2   1   0

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Используя основание r:

Поскольку мы берем абсолюты, то результаты всегда будут симметричной матрицей:

first (1) получим среднее абсолютных разностей столбцов, (2) получить комбинации, (3) создать матрицу измерений: ncol (df) * ncol (df) и (4) заполнить результаты:

a=combn(df,2,function(x)mean(abs(do.call("-",x))))#1

b= t(combn(ncol(df),2)) #(2)

d = matrix(0,ncol(df),ncol(df))#(3)

d[b]=a
d+t(d)
   [,1] [,2] [,3]
[1,]    0    1    2
[2,]    1    0    1
[3,]    2    1    0

вы можете написать длиннуюкод линии:

  replace(matrix(0,ncol(df),ncol(df)),rbind(i<-t(combn(ncol(df),2)),i[,2:1]),rep(combn(df,2,function(x)mean(abs(do.call("-",x)))),2))
     [,1] [,2] [,3]
[1,]    0    1    2
[2,]    1    0    1
[3,]    2    1    0
0 голосов
/ 06 июня 2018

Попробуйте с diag

abs(df-diag(as.matrix(df)))
#   m1 m2 m3
# 1  0  1  2
# 2  1  0  1
# 3  2  1  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...