[R-es] Extraer elementos diagonales de submatrices

Olivier Nuñez onunez en unex.es
Jue Oct 29 16:00:59 CET 2015


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



Más información sobre la lista de distribución R-help-es