Как преобразовать фрейм данных в симметричную матрицу в R? - PullRequest
1 голос
/ 11 июля 2019

Вот пример:

 df<-data.frame(x=c(1,1,2),y=c(2,3,3),z=c(0.1,0.2,0.3))
 df
  x y   z
1 1 2 0.1
2 1 3 0.2
3 2 3 0.3

Как преобразовать его в симметричную матрицу, такую ​​как:

    1   2   3
1 1.0 0.1 0.2
2 0.1 1.0 0.3
3 0.2 0.3 1.0

Где заполненные значения df $ z для возможных df $пары x и df $ y.Диагонали заполнены как единица 1.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Мы можем создать matrix со всеми 1 с, затем заполнить upper.tri и lower.tri в соответствии с order ed строками df.Это также работает для столбцов 1:2 в формате "character", если их можно соответствующим образом упорядочить.

M <- matrix(1, nrow(df), ncol(df))
M[lower.tri(M)] <- M[upper.tri(M)] <- df[order(df$x, df$y), ][[3]]
#      [,1] [,2] [,3]
# [1,]  1.0  0.1  0.2
# [2,]  0.1  1.0  0.3
# [3,]  0.2  0.3  1.0
0 голосов
/ 11 июля 2019

Создайте диагональную матрицу m, а затем установите внешние диагонали, как показано:

m <- diag(3)
m[cbind(df$x, df$y)] <- m[cbind(df$y, df$x)] <- df$z
m

, давая:

     [,1] [,2] [,3]
[1,]  1.0  0.1  0.2
[2,]  0.1  1.0  0.3
[3,]  0.2  0.3  1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...