[R-es] Crear variable con condiciones

Javier Rubén Marcuzzi javier.ruben.marcuzzi en gmail.com
Mie Oct 21 05:30:03 CEST 2015


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



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