Buenos dias a todos, Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion: ## input m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L)) m ## output output <- c(1:3, 1:5, 1:2) output Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria : [image: Inline image 2] Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1. A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector # [1] 1 2 3 1 2 3 4 5 1 2 Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector. Saludos cordiales, Jorge Velez.- ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20151028/afa217d1/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: example.png Type: image/png Size: 35497 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20151028/afa217d1/attachment-0001.png>
[R-es] Extraer elementos diagonales de submatrices
9 messages · Jorge I Velez, Javier Marcuzzi, Olivier Nuñez +1 more
Estimado Jorge I Velez No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices? Ejemplo 123 12345 12 O en una forma 1231234512 ¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil? Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario De: Jorge I Velez Enviado: miércoles, 28 de octubre de 2015 12:15 Para: R-help-es Asunto: [R-es] Extraer elementos diagonales de submatrices Buenos dias a todos, Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion: ## input m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L)) m ## output output <- c(1:3, 1:5, 1:2) output Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria: Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1. A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector # [1] 1 2 3 1 2 3 4 5 1 2 Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector. Saludos cordiales, Jorge Velez.- ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20151028/15f9fa5f/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: A08A9F83AB65410AB3B9945904D1D19A.png Type: image/png Size: 34007 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20151028/15f9fa5f/attachment-0001.png>
Estimado Javier, Gracias por tu mensaje. No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2). Saludos cordiales, Jorge.- 2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi < javier.ruben.marcuzzi en gmail.com>:
Estimado Jorge I Velez No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices? Ejemplo 123 12345 12 O en una forma 1231234512 ¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil? Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario *De: *Jorge I Velez *Enviado: *miércoles, 28 de octubre de 2015 12:15 *Para: *R-help-es *Asunto: *[R-es] Extraer elementos diagonales de submatrices Buenos dias a todos, Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion: ## input m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L)) m ## output output <- c(1:3, 1:5, 1:2) output Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria: [image: Inline image 2] Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1. A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector # [1] 1 2 3 1 2 3 4 5 1 2 Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector. Saludos cordiales, Jorge Velez.-
Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de elementos en diagonal mayor que cero) . Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario De: Jorge I Velez Enviado: miércoles, 28 de octubre de 2015 16:40 Para: Javier Rubén Marcuzzi CC: R-help-es Asunto: Re: [R-es] Extraer elementos diagonales de submatrices Estimado Javier, Gracias por tu mensaje. No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2). Saludos cordiales, Jorge.- 2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com>: Estimado Jorge I Velez  No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?  Ejemplo 123 12345 12  O en una forma 1231234512  ¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil?  Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario   De: Jorge I Velez Enviado: miércoles, 28 de octubre de 2015 12:15 Para: R-help-es Asunto: [R-es] Extraer elementos diagonales de submatrices   Buenos dias a todos,  Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion:  ## input m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L)) m  ## output output <- c(1:3, 1:5, 1:2) output  Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria:   Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1.  A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector  # [1] 1 2 3 1 2 3 4 5 1 2  Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector.  Saludos cordiales, Jorge Velez.-   Â
Estimado Jorge I Velez Tengo una idea que funcionarÃa y otra con problemas. La que funcionarÃa es simple, aunque puede ser algo lenta, básicamente es por un bucle ir recorriendo el Ãndice de la matriz extrayendo el valor, Ãndice1,1, luego 2,2, luego 3,3 ?., en caso que el valor sea 0, pasar a Ãndice 4,1, 4,2. Yo tengo algunos códigos donde se recorre la matriz ?a mano? pero comparado con versiones vectorizadas hay mucha diferencia. (puedo buscarlos o adaptar, son algo de 20 lÃneas) La otra idea, que pensé ayer, da dos problemas, posiblemente se solucionan fácil, alcanzo a reconocer los valores para extraer, pero tiene un problema en el alcance y cuándo llega al final, posiblemente cambiando el tipo de bucle esto se soluciona. Copio y pego el código, aunque tiene esos problemas, la idea está y con algo de trabajo alguien la mejora más rápido que yo (que ahora tengo que hacer otras cosas y no puedo continuar en eso, aunque mañana podrÃa). Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario De: Javier Rubén Marcuzzi Enviado: miércoles, 28 de octubre de 2015 17:22 Para: Jorge I Velez CC: R-help-es Asunto: RE: [R-es] Extraer elementos diagonales de submatrices Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de elementos en diagonal mayor que cero) . Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario De: Jorge I Velez Enviado: miércoles, 28 de octubre de 2015 16:40 Para: Javier Rubén Marcuzzi CC: R-help-es Asunto: Re: [R-es] Extraer elementos diagonales de submatrices Estimado Javier, Gracias por tu mensaje. No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2). Saludos cordiales, Jorge.- 2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com>: Estimado Jorge I Velez  No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?  Ejemplo 123 12345 12  O en una forma 1231234512  ¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil?  Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario   De: Jorge I Velez Enviado: miércoles, 28 de octubre de 2015 12:15 Para: R-help-es Asunto: [R-es] Extraer elementos diagonales de submatrices   Buenos dias a todos,  Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion:  ## input m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L)) m  ## output output <- c(1:3, 1:5, 1:2) output  Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria:   Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1.  A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector  # [1] 1 2 3 1 2 3 4 5 1 2  Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector.  Saludos cordiales, Jorge Velez.-   Â
El código que me olvide pegar
input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
## output
output <- c(1:3, 1:5, 1:2)
output
nfilas <- nrow(m)
while(nfilas > 0) {
diagonal <- diag(m)
elementosDeseadosDiagonal <- diagonal[diagonal>0]
GuardoElementosDeseadosDiagonal <- rbind(elementosDeseadosDiagonal)
PuntoDeCorte <- length(elementosDeseadosDiagonal)
print(paste("Corte ", PuntoDeCorte,sep=""))
while(PuntoDeCorte > 0)
{
if(PuntoDeCorte == 0) break;
print((m))
m <- m[-1,]
PuntoDeCorte <- PuntoDeCorte-1
}
nfilas <- nfilas-1;
print(paste("n filas ", nfilas, sep = ""))
print(elementosDeseadosDiagonal)
print(GuardoElementosDeseadosDiagonal)
}
GuardoElementosDeseadosDiagonal
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Javier Rubén Marcuzzi
Enviado: miércoles, 28 de octubre de 2015 17:22
Para: Jorge I Velez
CC: R-help-es
Asunto: RE: [R-es] Extraer elementos diagonales de submatrices
Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de elementos en diagonal mayor que cero) .
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 16:40
Para: Javier Rubén Marcuzzi
CC: R-help-es
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Estimado Javier,
Gracias por tu mensaje.
No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2).
Saludos cordiales,
Jorge.-
2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com>:
Estimado Jorge I Velez
Â
No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?
Â
Ejemplo
123
12345
12
Â
O en una forma
1231234512
Â
¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil?
Â
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
Â
Â
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 12:15
Para: R-help-es
Asunto: [R-es] Extraer elementos diagonales de submatrices
Â
Â
Buenos dias a todos,
Â
Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion:
Â
## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,Â
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,Â
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,Â
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
Â
## output
output <- c(1:3, 1:5, 1:2)
output
Â
Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria:
Â
Â
Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1.
Â
A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector
Â
# [1] 1 2 3 1 2 3 4 5 1 2
Â
Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector.
Â
Saludos cordiales,
Jorge Velez.-
Â
Â
Â
Jorge,
si creas un Ãndice ("dd" en mi código) para las diagonales (las "cohortes" en un diagrama de Lexis),
se puede elaborar un script más o menos elegante para hallar tu output:
require(data.table)
temp=data.table(m)
temp[,row:=1:nrow(m)]
D=melt(temp,id.vars="row",variable.name = "col")
D[,col:=as.numeric(factor(col))]
D[,dd:=(ncol(m)-col)+row] #Ãndice de la diagonal
DD=subset(DD,dd>=ncol(m))
setkey(D,dd,row)
DD[,suma:=cumsum(abs(value)),by=dd]
DD[,l:=length(unique(suma)),by=dd]
dmax=max(DD$dd)
res=DD[,.(saltos=unique(dd+l)),by=dd]
diags=ncol(m);i=1
while(res[dd==diags[i],saltos]<dmax) {
diags=c(diags,res[dd==diags[i],saltos])
i=i+1
}
DD[dd %in% diags & !value==0, .(output=value),by=dd]
dd output
1: 5 1
2: 5 2
3: 5 3
4: 8 1
5: 8 2
6: 8 3
7: 8 4
8: 8 5
9: 13 1
10: 13 2
Un saludo. Olivier
----- Mensaje original -----
De: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
Para: "Jorge I Velez" <jorgeivanvelez en gmail.com>
CC: "R-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 29 de Octubre 2015 12:05:52
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
El código que me olvide pegar
input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
## output
output <- c(1:3, 1:5, 1:2)
output
nfilas <- nrow(m)
while(nfilas > 0) {
diagonal <- diag(m)
elementosDeseadosDiagonal <- diagonal[diagonal>0]
GuardoElementosDeseadosDiagonal <- rbind(elementosDeseadosDiagonal)
PuntoDeCorte <- length(elementosDeseadosDiagonal)
print(paste("Corte ", PuntoDeCorte,sep=""))
while(PuntoDeCorte > 0)
{
if(PuntoDeCorte == 0) break;
print((m))
m <- m[-1,]
PuntoDeCorte <- PuntoDeCorte-1
}
nfilas <- nfilas-1;
print(paste("n filas ", nfilas, sep = ""))
print(elementosDeseadosDiagonal)
print(GuardoElementosDeseadosDiagonal)
}
GuardoElementosDeseadosDiagonal
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Javier Rubén Marcuzzi
Enviado: miércoles, 28 de octubre de 2015 17:22
Para: Jorge I Velez
CC: R-help-es
Asunto: RE: [R-es] Extraer elementos diagonales de submatrices
Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de elementos en diagonal mayor que cero) .
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 16:40
Para: Javier Rubén Marcuzzi
CC: R-help-es
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Estimado Javier,
Gracias por tu mensaje.
No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2).
Saludos cordiales,
Jorge.-
2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com>:
Estimado Jorge I Velez
Â
No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?
Â
Ejemplo
123
12345
12
Â
O en una forma
1231234512
Â
¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil?
Â
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
Â
Â
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 12:15
Para: R-help-es
Asunto: [R-es] Extraer elementos diagonales de submatrices
Â
Â
Buenos dias a todos,
Â
Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion:
Â
## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,Â
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,Â
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,Â
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
Â
## output
output <- c(1:3, 1:5, 1:2)
output
Â
Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria:
Â
Â
Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1.
Â
A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector
Â
# [1] 1 2 3 1 2 3 4 5 1 2
Â
Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector.
Â
Saludos cordiales,
Jorge Velez.-
Â
Â
Â
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
Bueno, habia un pequeño bug. Aproveché para simplificar el codigo:
require(data.table)
temp=data.table(m)
temp[,row:=1:nrow(m)]
D=melt(temp,id.vars="row",variable.name = "col")
D[,col:=as.numeric(factor(col))]
D[,dd:=(ncol(m)-col)+row] #determina la diagonal
DD=subset(D,dd>=ncol(m))
setkey(D,dd,row)
res=DD[,.(saltos=dd-1+min(which(value==0),ncol(m)+1)),by=dd]
diags=ncol(m);i=1
dmax=max(DD$dd)
while(res[dd==diags[i],saltos]<dmax) {
diags=c(diags,res[dd==diags[i],saltos])
i=i+1
}
DD[dd %in% diags & !value==0, .(output=value),by=dd]
dd output
1: 5 1
2: 5 2
3: 5 3
4: 8 1
5: 8 2
6: 8 3
7: 8 4
8: 8 5
9: 13 1
10: 13 2
Un saludo. Olivier
----- Mensaje original -----
De: "Olivier Nuñez" <onunez en unex.es>
Para: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
CC: "R-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 29 de Octubre 2015 14:52:47
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Jorge,
si creas un Ãndice ("dd" en mi código) para las diagonales (las "cohortes" en un diagrama de Lexis),
se puede elaborar un script más o menos elegante para hallar tu output:
require(data.table)
temp=data.table(m)
temp[,row:=1:nrow(m)]
D=melt(temp,id.vars="row",variable.name = "col")
D[,col:=as.numeric(factor(col))]
D[,dd:=(ncol(m)-col)+row] #Ãndice de la diagonal
DD=subset(DD,dd>=ncol(m))
setkey(D,dd,row)
DD[,suma:=cumsum(abs(value)),by=dd]
DD[,l:=length(unique(suma)),by=dd]
dmax=max(DD$dd)
res=DD[,.(saltos=unique(dd+l)),by=dd]
diags=ncol(m);i=1
while(res[dd==diags[i],saltos]<dmax) {
diags=c(diags,res[dd==diags[i],saltos])
i=i+1
}
DD[dd %in% diags & !value==0, .(output=value),by=dd]
dd output
1: 5 1
2: 5 2
3: 5 3
4: 8 1
5: 8 2
6: 8 3
7: 8 4
8: 8 5
9: 13 1
10: 13 2
Un saludo. Olivier
----- Mensaje original -----
De: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
Para: "Jorge I Velez" <jorgeivanvelez en gmail.com>
CC: "R-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 29 de Octubre 2015 12:05:52
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
El código que me olvide pegar
input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
## output
output <- c(1:3, 1:5, 1:2)
output
nfilas <- nrow(m)
while(nfilas > 0) {
diagonal <- diag(m)
elementosDeseadosDiagonal <- diagonal[diagonal>0]
GuardoElementosDeseadosDiagonal <- rbind(elementosDeseadosDiagonal)
PuntoDeCorte <- length(elementosDeseadosDiagonal)
print(paste("Corte ", PuntoDeCorte,sep=""))
while(PuntoDeCorte > 0)
{
if(PuntoDeCorte == 0) break;
print((m))
m <- m[-1,]
PuntoDeCorte <- PuntoDeCorte-1
}
nfilas <- nfilas-1;
print(paste("n filas ", nfilas, sep = ""))
print(elementosDeseadosDiagonal)
print(GuardoElementosDeseadosDiagonal)
}
GuardoElementosDeseadosDiagonal
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Javier Rubén Marcuzzi
Enviado: miércoles, 28 de octubre de 2015 17:22
Para: Jorge I Velez
CC: R-help-es
Asunto: RE: [R-es] Extraer elementos diagonales de submatrices
Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de elementos en diagonal mayor que cero) .
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 16:40
Para: Javier Rubén Marcuzzi
CC: R-help-es
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Estimado Javier,
Gracias por tu mensaje.
No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5, 1, 2).
Saludos cordiales,
Jorge.-
2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com>:
Estimado Jorge I Velez
Â
No comprendo un punto, dices que deseas construir sub matrices y extraer elementos de sub matrices, en el ejemplo en output no hay sub matrices (tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?
Â
Ejemplo
123
12345
12
Â
O en una forma
1231234512
Â
¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con tener la lista de números le es útil?
Â
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
Â
Â
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 12:15
Para: R-help-es
Asunto: [R-es] Extraer elementos diagonales de submatrices
Â
Â
Buenos dias a todos,
Â
Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta algunas restricciones. El siguiente ejemplo ilustra la situacion:
Â
## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,Â
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,Â
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,Â
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
Â
## output
output <- c(1:3, 1:5, 1:2)
output
Â
Si el numero de filas es r y el numero de columnas k, la idea es construir submatrices de dimension k x k y extraer los elementos diagonales NO ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la siguiente fila, y construir una nueva matriz k x k. Graficamente esto seria:
Â
Â
Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO en la fila 4, columna 1.
Â
A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y 5, que corresponden a su diagonal (en azul celeste). La posicion del ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz debe comenzar en la fila 9. A partir de esta submatriz se obtienen los valores 1 y 2 (en naranja). El resultado final de todo este proceso es el vector
Â
# [1] 1 2 3 1 2 3 4 5 1 2
Â
Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto por cualquier sugerencia que me permita obtener este vector.
Â
Saludos cordiales,
Jorge Velez.-
Â
Â
Â
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
Hola a todos,
Como la idea de Javier recorro las diferentes submatrices pero moviendo las
columnas y filas seleccionadas.
El código es,
## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
# Extracción
r <- dim(m)[1] # Filas
k <- dim(m)[2] # Columnas
# Inicialización
inicio <- 1
fin <- k
resul <- c()
para <- 0
fila <- inicio:fin
columna <- 1:k
while(para == 0){
A1 <- m[fila,columna]
A1
diagonal <- diag(A1)
resul <- c(resul,diagonal[diagonal!=0]) # Acumula los valores, distintos
de cero, de las sucesivas diagonales
resul
# Tomar una nueva matriz
indice <- which(diagonal == 0)
indice
if ( length(indice) > 0){
inicio <- indice[1]
fin <- min(inicio + k-1,r)
}else {
inicio <- fin + 1
fin <- min(inicio + k-1,r)
}
# Caso particular de llegar al fin de la matriz kxr
if(fin >r){
fila <- inicio:(r-fin)
columna <- 1:length(fila)
} else {fila <- inicio:fin}
if (inicio >r ) para <- 1
inicio
fin
}
# Valores de la diagonales
resul
Un saludo
El 29 de octubre de 2015, 16:00, Olivier Nuñez <onunez en unex.es> escribió:
Bueno, habia un pequeño bug. Aproveché para simplificar el codigo:
require(data.table)
temp=data.table(m)
temp[,row:=1:nrow(m)]
D=melt(temp,id.vars="row",variable.name = "col")
D[,col:=as.numeric(factor(col))]
D[,dd:=(ncol(m)-col)+row] #determina la diagonal
DD=subset(D,dd>=ncol(m))
setkey(D,dd,row)
res=DD[,.(saltos=dd-1+min(which(value==0),ncol(m)+1)),by=dd]
diags=ncol(m);i=1
dmax=max(DD$dd)
while(res[dd==diags[i],saltos]<dmax) {
diags=c(diags,res[dd==diags[i],saltos])
i=i+1
}
DD[dd %in% diags & !value==0, .(output=value),by=dd]
dd output
1: 5 1
2: 5 2
3: 5 3
4: 8 1
5: 8 2
6: 8 3
7: 8 4
8: 8 5
9: 13 1
10: 13 2
Un saludo. Olivier
----- Mensaje original -----
De: "Olivier Nuñez" <onunez en unex.es>
Para: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
CC: "R-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 29 de Octubre 2015 14:52:47
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Jorge,
si creas un Ãndice ("dd" en mi código) para las diagonales (las "cohortes"
en un diagrama de Lexis),
se puede elaborar un script más o menos elegante para hallar tu output:
require(data.table)
temp=data.table(m)
temp[,row:=1:nrow(m)]
D=melt(temp,id.vars="row",variable.name = "col")
D[,col:=as.numeric(factor(col))]
D[,dd:=(ncol(m)-col)+row] #Ãndice de la diagonal
DD=subset(DD,dd>=ncol(m))
setkey(D,dd,row)
DD[,suma:=cumsum(abs(value)),by=dd]
DD[,l:=length(unique(suma)),by=dd]
dmax=max(DD$dd)
res=DD[,.(saltos=unique(dd+l)),by=dd]
diags=ncol(m);i=1
while(res[dd==diags[i],saltos]<dmax) {
diags=c(diags,res[dd==diags[i],saltos])
i=i+1
}
DD[dd %in% diags & !value==0, .(output=value),by=dd]
dd output
1: 5 1
2: 5 2
3: 5 3
4: 8 1
5: 8 2
6: 8 3
7: 8 4
8: 8 5
9: 13 1
10: 13 2
Un saludo. Olivier
----- Mensaje original -----
De: "Javier Rubén Marcuzzi" <javier.ruben.marcuzzi en gmail.com>
Para: "Jorge I Velez" <jorgeivanvelez en gmail.com>
CC: "R-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 29 de Octubre 2015 12:05:52
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
El código que me olvide pegar
input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
## output
output <- c(1:3, 1:5, 1:2)
output
nfilas <- nrow(m)
while(nfilas > 0) {
diagonal <- diag(m)
elementosDeseadosDiagonal <- diagonal[diagonal>0]
GuardoElementosDeseadosDiagonal <- rbind(elementosDeseadosDiagonal)
PuntoDeCorte <- length(elementosDeseadosDiagonal)
print(paste("Corte ", PuntoDeCorte,sep=""))
while(PuntoDeCorte > 0)
{
if(PuntoDeCorte == 0) break;
print((m))
m <- m[-1,]
PuntoDeCorte <- PuntoDeCorte-1
}
nfilas <- nfilas-1;
print(paste("n filas ", nfilas, sep = ""))
print(elementosDeseadosDiagonal)
print(GuardoElementosDeseadosDiagonal)
}
GuardoElementosDeseadosDiagonal
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Javier Rubén Marcuzzi
Enviado: miércoles, 28 de octubre de 2015 17:22
Para: Jorge I Velez
CC: R-help-es
Asunto: RE: [R-es] Extraer elementos diagonales de submatrices
Bien, estoy pensando, diagonal, elementos diagonal mayor que 0, cantidad
de elementos en diagonal mayor que cero, borrar esa cantidad de filas de la
matriz, todo esto dentro de un bucle, lógicamente guardo (rbind cantidad de
elementos en diagonal mayor que cero) .
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 16:40
Para: Javier Rubén Marcuzzi
CC: R-help-es
Asunto: Re: [R-es] Extraer elementos diagonales de submatrices
Estimado Javier,
Gracias por tu mensaje.
No, lo unico que requiero es la lista de números (i1, 2, 3, 1, 2, 3, 4, 5,
1, 2).
Saludos cordiales,
Jorge.-
2015-10-28 14:35 GMT-05:00 Javier Rubén Marcuzzi <
javier.ruben.marcuzzi en gmail.com>:
Estimado Jorge I Velez
No comprendo un punto, dices que deseas construir sub matrices y extraer
elementos de sub matrices, en el ejemplo en output no hay sub matrices
(tres matrices como resultado) sino una cadena de números. ¿Cómo necesitas
el resultado?, ¿Cómo se ve en el ejemplo?, ¿Cómo matrices de matrices?
Ejemplo
123
12345
12
O en una forma
1231234512
¿Hay que dejar algo (Ãndice) como para que accedas a algo reconocido o
especificado, ej, segundo valor de la segunda sub matriz (2,2), ¿o con
tener la lista de números le es útil?
Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario
De: Jorge I Velez
Enviado: miércoles, 28 de octubre de 2015 12:15
Para: R-help-es
Asunto: [R-es] Extraer elementos diagonales de submatrices
Buenos dias a todos,
Quisiera extraer algunas entradas de una matrix "m" teniendo en cuenta
algunas restricciones. El siguiente ejemplo ilustra la situacion:
## input
m <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0,
0, 0, 0, 5, 5, 5), .Dim = c(10L, 5L))
m
## output
output <- c(1:3, 1:5, 1:2)
output
Si el numero de filas es r y el numero de columnas k, la idea es construir
submatrices de dimension k x k y extraer los elementos diagonales NO
ceros. Ahora, en caso de encontrar un cero, debe desplazarse a la
siguiente fila, y construir una nueva matriz k x k. Graficamente esto
seria:
Observe que en este caso, r = 10 y k = 5. En la primera submatriz, la
diagonal tiene los valores 1, 2, 3, 0, 0, de los cuales SOLO deben
seleccionarse 1, 2 y 3 (en lila). El primer cero se encuentra en la
posicion [1, 4], asi que la siguiente submatriz debe construirse COMENZANDO
en la fila 4, columna 1.
A partir de esta segunda submatriz se obtienen los elements 1, 2, 3, 4 y
5, que corresponden a su diagonal (en azul celeste). La posicion del
ultimo elemento de esta diagonal es [8, 5], asi que la siguiente submatriz
debe comenzar en la fila 9. A partir de esta submatriz se obtienen los
valores 1 y 2 (en naranja). El resultado final de todo este proceso es el
vector
# [1] 1 2 3 1 2 3 4 5 1 2
Agradezco a todos el tiempo que les tomo leer este mensaje, y por supuesto
por cualquier sugerencia que me permita obtener este vector.
Saludos cordiales,
Jorge Velez.-
[[alternative HTML version deleted]]
_______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Jose Luis [[alternative HTML version deleted]]