Estimado Jorge I Velez
Le envÃo un código, la primer parte es lo que tiene, la segunda lo que desea, a ambos los puse en un mismo data.frame (originales), luego agrego la idea de quitar un elemento en otra columna y lo sumo a todo esto en un nuevo data.frame.
A este nuevo data.frame (mis_datos) le ejecuto una función para contar, creo que en su caso no hay problemas para escribir la función que realiza la tarea que usted necesita.
Ejecute el siguiente código y creo que entenderá cuál es mi idea para su problema
## 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))))
Básicamente modificando cuento <- ?.. podrÃa solucionarlo (creo).
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