2015-09-28

Cómo crear una matriz simétrica en R

Title

Problema

Partimos de la siguiente matriz/data frame y deseamos crear una matriz simétrica.

Datos

  V1 V2 V3 V4 V5
1  0  2  3  4  5
2  0  0  6  8 10
3  0  0  0 12 15
4  0  0  0  0 20
5  0  0  0  0  0
df <- structure(list(V1 = c(0L, 0L, 0L, 0L, 0L), V2 = c(2L, 0L, 0L, 
0L, 0L), V3 = c(3L, 6L, 0L, 0L, 0L), V4 = c(4L, 8L, 12L, 0L, 
0L), V5 = c(5L, 10L, 15L, 20L, 0L)), .Names = c("V1", "V2", "V3", 
"V4", "V5"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5"))

Soluciones

  • Sumando la matriz transpuesta
  • df + t(df)
  • Función lower.tri.
  • df[lower.tri(df)] <- t(df)[lower.tri(df)]
      V1 V2 V3 V4 V5
    1  0  2  3  4  5
    2  2  0  6  8 10
    3  3  6  0 12 15
    4  4  8 12  0 20
    5  5 10 15 20  0

    Asignamos a la parte inferior de una matriz triangular superior, los valores de la parte superior. Con lower.tri obtenemos el triángulo inferior. Le asignamos la parte superior que transponemos previamente la matriz —t(df)—, por eso volvemos a usar lower.tri . Pues si usáramos upper.tri el resultado no sería una matriz simétrica.

    df[lower.tri(df)] <- df[upper.tri(df)]
      V1 V2 V3 V4 V5
    1  0  2  3  4  5
    2  2  0  6  8 10
    3  3  8  0 12 15
    4  6 12 10  0 20
    5  4  5 15 20  0
    

Entradas relacionadas

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos