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 <onu...@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" <onu...@unex.es> > Para: "Javier Rubén Marcuzzi" <javier.ruben.marcu...@gmail.com> > CC: "R-help-es" <r-help-es@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.marcu...@gmail.com> > Para: "Jorge I Velez" <jorgeivanve...@gmail.com> > CC: "R-help-es" <r-help-es@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.marcu...@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > -- Jose Luis [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es