superponer - R-min, max y media de elementos fuera de diagonal en una matriz
superponer graficas en r (6)
Tengo una matriz en R y quiero obtener:
Max off - diagonal elements
Min off – diagonal elements
Mean off –diagonal elements
Con diagonal utilicé max (diag (A)), min (diag (A)), mean (diag (A)) y funcionó bien
Pero por fuera de diagonal probé
dataD <- subset(A, V1!=V2)
Error in subset.matrix(A, V1 != V2) : object ''V1'' not found
usar:
colMeans(dataD) # get the mean for columns
pero no puedo obtener datosD b / c dice que el objeto ''V1'' no se encuentra
¡Gracias!
Además de la respuesta de James, quiero agregar que puede usar la función diag para excluir directamente todos los elementos diagonales de una matriz mediante el uso de A[-diag(A)]
. Por ejemplo, considere: summary(A[-diag(A)])
Aquí las funciones auxiliares row()
y col()
son útiles. Usando @James A
, podemos obtener la diagonal fuera de la diagonal usando este pequeño truco:
> A[row(A) == (col(A) - 1)]
[1] 5 10 15
y la diagonal más baja a través de esto:
> A[row(A) == (col(A) + 1)]
[1] 2 7 12
Estos pueden ser generalizados para dar las diagonales que desee:
> A[row(A) == (col(A) - 2)]
[1] 9 14
y no requieren ningún subconjunto.
Entonces es una simple cuestión de llamar a cualquier función que desee en estos valores. P.ej:
> mean(A[row(A) == (col(A) - 1)])
[1] 10
Si según mi comentario te refieres a todo menos a la diagonal , utiliza
> diag(A) <- NA
> mean(A, na.rm = TRUE)
[1] 8.5
> max(A, na.rm = TRUE)
[1] 15
> # etc. using sum(A, na.rm = TRUE), min(A, na.rm = TRUE), etc..
Para que esto no se pierda, Ben Bolker sugiere (en los comentarios) que el bloque de código anterior se puede hacer de forma más clara usando las funciones row()
y col()
que mencioné anteriormente:
mean(A[row(A)!=col(A)])
min(A[row(A)!=col(A)])
max(A[row(A)!=col(A)])
sum(A[row(A)!=col(A)])
que es una mejor solución en general.
El diag
de una matriz subconjuntada adecuadamente le dará las diagonales fuera de diagonales. Por ejemplo:
A <- matrix(1:16,4)
#upper off-diagonal
diag(A[-4,-1])
[1] 5 10 15
#lower off-diagonal
diag(A[-1,-4])
[1] 2 7 12
En una simple línea de código:
Para una matriz A, si desea encontrar el Mínimo , el 1er cuartil, la Mediana, la Media , el 3er cuartil y el Máximo de las diagonales superiores e inferiores de desconexión:
summary(c(A[upper.tri(A)],A[lower.tri(A)]))
.
Simplemente multiplique la matriz A por 1-diag (nofelements)
por ejemplo, si A es una matriz de 4x4, entonces
media (A * (1-diag (4)) o A * (1-diag (nrow (A)))
Esto es más rápido cuando necesita ejecutar la misma línea de código varias veces
Para obtener un vector que contenga el máximo de los elementos fuera de diagonal de cada columna o fila de una matriz, se requieren unos pocos pasos más. Me dirigieron aquí cuando buscaba ayuda para eso. Quizás otros hagan lo mismo, entonces ofrezco esta solución, que encontré usando lo que aprendí aquí.
El truco es crear una matriz de solo los elementos fuera de diagonal. Considerar:
> A <- matrix(c(10,2,3, 4,10,6, 7,8,10), ncol=3)
> A
[,1] [,2] [,3]
[1,] 10 4 7
[2,] 2 10 8
[3,] 3 6 10
> apply(A, 2, max)
[1] 10 10 10
Subconjunto utilizando la indexación sugerida, A[row(A)!=col(A)]
produce un vector de elementos fuera de diagonal, en orden de columnas:
> v <- A[row(A)!=col(A)]
> v
[1] 2 3 4 6 7 8
Devolver esto a una matriz permite el uso de apply()
para aplicar una función de elección a un margen de solo elementos fuera de diagonal. Usando la función max
como ejemplo:
> A.off <- matrix(v, ncol=3)
> A.off
[,1] [,2] [,3]
[1,] 2 4 7
[2,] 3 6 8
> v <- apply(A.off, 2, max)
> v
[1] 3 6 8
Toda la operación puede ser codificada de forma compacta y críptica en una sola línea:
> v <- apply(matrix(A[row(A)!=col(A)], ncol=ncol(A)), 2, max)
> v
[1] 3 6 8