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)
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