[R-es] Crear variable con condiciones

Carlos Ortega cof en qualityexcellence.es
Jue Oct 22 00:41:31 CEST 2015


Hola Jorge,

Con esto replico tu salida menos el segundo elemento de la columna TOENDREF.
Que en tu salida de hecho no cumple las reglas que has comentado.

#----------------------
hm0 <- rep(0,nrow(datain))
datOut <- data.frame(REF=hm0, TIMEREF=hm0, TOENDREF=hm0, NEWREF=hm0)
for( i in 1: nrow(datain)) {

  datOut$REF[i] <- datain$REF[i]
  datOut$TIMEREF[i] <- datain$TIMEREF[i]

  if(i==1) {
    datOut$TOENDREF[i] <- datain$TOENDREF[i]
    datOut$NEWREF[i] <- datain$REF[i]
  } else {
        if(datain$TIMEREF[i] <= datOut$TOENDREF[i-1] ) {
           datOut$TOENDREF[i] <- datOut$TOENDREF[i-1] - datain$TIMEREF[i]
           j <- 0
        } else {
                  datOut$TOENDREF[i] <- datain$TOENDREF[i]
                  j <- 1
               }
  }

  if(j==1) { datOut$NEWREF[i] <- datain$REF[i]
  } else { datOut$NEWREF[i] <- datOut$NEWREF[i-1]  }

}
datOut
#----------------------

Saludos,
Carlos Ortega
www.qualityexcellence.es


El 22 de octubre de 2015, 0:07, Javier Rubén Marcuzzi <
javier.ruben.marcuzzi en gmail.com> escribió:

>
> Jorge
>
> Creo que se perdió un correo donde decía algunas cosas y envié lo
> siguiente (básicamente, modificando lo que yo nombre “cuento”, con una
> función específica para usted…).
>
> ## entrada
> datain <- structure(list(REF = c("999", "999", "999", "1099", "731",
> "731", "731", "731", "1442", "1442", "1442", "1442"),
>                          TIMEREF = c(120,240, 360, 30, 30, 60, 90, 120,
> 30, 60, 90, 120),
>                          TOENDREF = c(390,270, 150, 480, 480, 450, 420,
> 390, 480, 450, 420, 390)),
>                       .Names = c("REF","TIMEREF", "TOENDREF"),row.names =
> c(NA, 12L), class = "data.frame")
> datain
>
> ## salida
> dataout <- structure(list(REF = c(999L, 999L, 999L, 1099L, 731L, 731L,
> 731L, 731L, 1442L, 1442L, 1442L, 1442L),
>                           TIMEREF = c(120L, 240L, 360L,30L, 30L, 60L, 90L,
> 120L, 30L, 60L, 90L, 120L),
>                           TOENDREF = c(390L, 270L, 150L, 120L, 90L, 30L,
> 420L, 300L, 270L, 210L, 120L, 0L),
>                           NEWREF = c(999L, 999L, 999L, 999L, 999L, 999L,
> 731L, 731L, 731L, 731L, 731L, 731L)),
>                      .Names = c("REF", "TIMEREF", "TOENDREF", "NEWREF"),
> row.names = c(NA, 12L), class = "data.frame")
> dataout
>
> originales <- data.frame(datain, dataout)
> originales
>
> aux0 <- originales$TOENDREF
> #
> # primer elemento 0
> # luego todos menos el ultimo
> # este es eliminado posición lenght(aux0)
> aux <- c(0,(aux0[-(length(aux0))]))
>
> mis_datos <- data.frame(originales, aux)
> mis_datos
> cuento<-do.call(rbind, by(mis_datos, mis_datos$REF, function(x)
> cbind(1:nrow(x))))
>
> xxxx <- data.frame(mis_datos, cuento)
> xxxx
>
> Escribiría más pero ya me estoy yendo y a mi regreso posiblemente usted
> tenga el problema resuelto (es muy inteligente).
>
>
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Javier Rubén Marcuzzi
> Enviado: miércoles, 21 de octubre de 2015 15:25
> Para: Jorge I Velez
> CC: R-help-es
> Asunto: RE: [R-es] Crear variable con condiciones
>
>
> Estimado Jorge I Velez
>
> Recién llego y leo los correos mientras me acuesto a descansar un rato,
> puede ser que no alcance a razonarlo bien, pero posiblemente por la
> resolución a un problema parecido, lo que yo use es la creación de una
> nueva columna y se la agregue al mismo data.frame, pero a esta nueva
> columna, que es una lista copia de los originales pero le quite el primero
> y le agregue un valor al final (para que los n sean iguales, creo que usted
> tendría que realizar lo contrario), luego utilicé una función porque habría
> algo de proceso, pero básicamente con un if pueda decidir si utilizar una
> columna o la otra ( TOENDREF O TOENDREF_modificada, todos corridos una fila
> hacia abajo).
>
> Tendría que probarlo, pero seguro que usted lo realiza mas rápido y seguro
> (cansado no debo escribir R).
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Jorge I Velez
> Enviado: miércoles, 21 de octubre de 2015 10:26
> Para: Javier Rubén Marcuzzi
> CC: R-help-es
> Asunto: Re: [R-es] Crear variable con condiciones
>
>
> Muchas gracias Javier por tu respuesta.
>
> Si. Para obtener "dataout" se utilizan filas anteriores de acuerdo con la
> disponibilidad de la variable TOENDREF para cada valor de la variable REF.
> Por ejemplo, las filas 3 y 4 de "datain" son
>
> #REF TIMEREF TOENDREF
> #3  999     360      150
> #4 1099      30      480
>
> En la fila 3, el valor de TOENDREF es 150. Esto indica que hay 150
> unidades disponibles de esa referencia. Ahora, en la fila 4, TIMEREF es 30
> para REF = 1099.  Como en esta fila TIMEREF es menor que TOENDREF para la
> referencia anterior, entonces la nueva variable NEWREF debe ser 999 y no
> 1099.  El nuevo valor de TOENDREF en esta fila sera 150 - 30 = 120.  Esta
> seria la fila 4 de "dataout":
>
> REF TIMEREF TOENDREF NEWREF
> #4  1099      30      120    999
>
> Para la fila 5 de "dataout", los recursos disponibles corresponden al
> _nuevo_ valor de TOENDREF en NEWREF (i.e., 120).  Siguiendo la misma logica
> anterior, obtenemos entonces las filas 5 a 12 de "dataout":
>
> REF TIMEREF TOENDREF NEWREF
> #5   731      30       90    999
> #6   731      60       30    999
> #7   731      90      420    731
> #8   731     120      300    731
> #9  1442      30      270    731
> #10 1442      60      210    731
> #11 1442      90      120    731
> #12 1442     120        0    731
>
> Observa que en la ultima fila se agotaron todos los recursos de TOENDREF
> para NEWREF = 731, por lo que no fue necesario utilizar la REF = 1442.
>
> Espero que esta vez las cosas sean un poco mas claras.
>
> Los datos se pueden agrupar por la variable REF, que basicamente se
> refiere a la referencia de un producto.  Si aun tengo disponibilidad de ese
> producto (variable TOENDREF) entonces lo utilizo y cancelo la referencia
> siguiente.  Las unidades que se piden de cada producto corresponden a la
> variable TIMEREF.
>
> Gracias a todos de antemano por sus sugerencias.
>
> Saludos,
> Jorge
> ​Velez.-
>
>
> 2015-10-20 22:30 GMT-05:00 Javier Rubén Marcuzzi <
> javier.ruben.marcuzzi en gmail.com>:
> Estimado Jorge I Velez
>
> Yo hace unos años tuve un problema parecido y creo que había dos posibles
> soluciones y una era aportada por usted.
>
> No alcanzo a entender correctamente, al procesar el ejemplo hay números
> que no me coinciden con lo que comenta, le sugiero lo siguiente, cree
> nuevamente el ejemplo, con un cambio, un data.frame donde está lo que ahora
> es datain y dataout, que entiendo que es lo que quiere y lo que desea, pero
> al describir el ejemplo ref 1099, indique las coordenadas entre las filas
> (que son 12) y las columnas.
>
> Yo no alcanzo a comprender correctamente, ¿usa una fila con valores de
> otra fila anterior?, O se me acomodaron mal los datos y me perdí.  El caso
> parecido que yo tuve que resolver, de acuerdo a ciertos valores tomaba los
> de filas anteriores para realizar el cálculo. También necesito saber si hay
> una identificación tipo id de una base de datos o son números que no se
> pueden agrupar. Le pregunto porque en mi caso que puede ser parecido, pude
> realizar agrupación y columnas auxiliares (para procesar las condiciones).
>
> Javier Rubén Marcuzzi
> Técnico en Industrias Lácteas
> Veterinario
>
>
>
> De: Jorge I Velez
> Enviado: martes, 20 de octubre de 2015 19:17
> Para: R-help-es
> Asunto: [R-es] Crear variable con condiciones
>
>
> Buenas tardes a todos,
>
> Quisiera crear una variable de acuerdo a ciertas condiciones.  Me gustaria
> llegar de "datain" a "dataout".
>
> ## entrada
> datain <- structure(list(REF = c("999", "999", "999", "1099", "731", "731",
> "731", "731", "1442", "1442", "1442", "1442"), TIMEREF = c(120,
> 240, 360, 30, 30, 60, 90, 120, 30, 60, 90, 120), TOENDREF = c(390,
> 270, 150, 480, 480, 450, 420, 390, 480, 450, 420, 390)), .Names = c("REF",
> "TIMEREF", "TOENDREF"), row.names = c(NA, 12L), class = "data.frame")
> datain
>
> ## salida
> dataout <- structure(list(REF = c(999L, 999L, 999L, 1099L, 731L, 731L,
> 731L,
> 731L, 1442L, 1442L, 1442L, 1442L), TIMEREF = c(120L, 240L, 360L,
> 30L, 30L, 60L, 90L, 120L, 30L, 60L, 90L, 120L), TOENDREF = c(390L,
> 270L, 150L, 120L, 90L, 30L, 420L, 300L, 270L, 210L, 120L, 0L),
>     NEWREF = c(999L, 999L, 999L, 999L, 999L, 999L, 731L, 731L,
>     731L, 731L, 731L, 731L)), .Names = c("REF", "TIMEREF", "TOENDREF",
> "NEWREF"), row.names = c(NA, 12L), class = "data.frame")
> dataout
>
>
> A continuacion describo dos casos puntuales para ilustrar las condiciones
> que deben satisfacerse:
>
> * Ejemplo 1
> En REF = '1099', el TIMEREF es inferior al valor TOENDREF para REF = 99
> (i.e., 30 < 150). Por lo tanto, la nueva variable "NEWREF" debe tomar el
> valor de '99'.  Al realizar esta asignacion, se tiene que la fila 4 de
> "datain" se convierte en
>
> #REF TIMEREF TOENDREF NEWREF
> #4 1099      30      120    999
>
> Aqui, 120 es el valor de TOENDREF para REF = '99'.
>
> * Ejemplo 2
> El proceso continua reasignando el REF hasta que el valor resultante de
> TOENDREF sea inferior (o igual) al valor de TIMEREF del siguiente valor de
> REF como ocurre en la fila 6 de dataout
>
> #REF TIMEREF TOENDREF NEWREF
> #6 731      60       30    999
> #7 731      90      420    731
>
> Puesto que el valor TOENDREF de 30 en TIMEREF 99 no es suficiente para
> cubrir TIMEREF en TIMEREF 731, en la fila 7 NEWREF sera igual a REF.
>
> De antemano muchas gracias por la ayuda.
>
> Saludos cordiales a todos,
> 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
>
>
>
>
>
>
>
>
>         [[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
>



-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

	[[alternative HTML version deleted]]



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