varias superponer studio matrices lineas graficos graficas elementos agregar r sum mean

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