[R-es] Extraer elementos diagonales de submatrices
Jose Luis Brita
jlbrita en gmail.com
Jue Oct 29 20:30:39 CET 2015
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]]
Más información sobre la lista de distribución R-help-es