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]]