Buenas tardes a todos los participantes del foro. Me dirijo a vosotros porque estoy atascado con una duda de programación respecto al data frame:> dd # Data frame de 5 variables, leído de un archivo txtid sexo nacim origen final 1 1 0 02/09/1955 01/04/1985 01/02/2014 2 2 1 29/10/1951 15/08/1996 01/05/2009 3 3 0 30/10/1942 02/08/2000 01/02/2014 4 4 1 22/05/1932 25/02/1993 01/03/2011 5 5 0 29/12/1942 22/06/2007 01/07/2012 6 6 1 18/11/1935 07/08/2010 01/01/2014 A este data frame (cuya variable sexo ya está factorizada y cuyas otras variables ya están en formato de fecha) le quiero aplicar el siguiente código : conv <- function(data, edad_u=65) { # INICIO DE LA FUNCIÓN # Elimino individuos que tienen una edad_final < edat_u años # ========================================================= data$edad_final <- unclass(round(difftime(data$final, data$nacim, units="auto")/365.25,1)) data <- data[data$edad_final> edad_u,] data$edad_final <- NULL # Elimino provisionalmente la variable edad_final # Con los datos que quedan, distingo 2 situaciones: # 1) La fecha de "origen" es anterior ó igual a: 01-01-2006 # 2) La fecha de "origen" es posterior a: 01-01-2006 # ========================================================= for (i in 1:length(data$origen)) { # Fecha de origen anterior o igual al 01-01-2006: # ----------------------------------------------- if ((data$origen[i]) <= as.Date("2006-01-01")) { # Creo para este subconjunto la variable temporal "edad_2006" data$edad_2006 <- unclass(round(difftime('2006-01-01', data$nacim, units="auto")/365.25,1)) menor_t_2006 <- data[data$edad_2006 <= edad_u,] menor_t_2006$edad_ent <- edad_u mayor_t_2006 <- data[data$edad_2006 > edad_u,] mayor_t_2006$edad_ent <- unclass(round(difftime('2006-01-01', mayor_t_2006$nacim, units="auto")/365.25,1)) data1.new <- rbind(menor_t_2006, mayor_t_2006) data1.new <- data1.new[,-which(names(data1.new) %in% c('edad_2006'))] } # Fecha de origen posterior al 01-01-2006: # ---------------------------------------- else if(data$origen[i] > as.Date('2006-01-01')) { # Creo para este otro subconjunto la variable temporal "edad_origen" data$edad_origen <- unclass(round(difftime(data$origen, data$nacim, units="auto")/365.25,1)) menor_t_origen <- data[data$edad_origen <= edad_u,] menor_t_origen$edad_ent <- edad_u mayor_t_origen <- data[data$edad_origen > edad_u,] mayor_t_origen$edad_ent <- unclass(round(difftime(mayor_t_origen$origen, mayor_t_origen$nacim, units="auto")/365.25,1)) data2.new <- rbind(menor_t_origen, mayor_t_origen) data2.new <- data2.new[,-which(names(data2.new) %in% c('edad_origen'))] } } # Resultado: Unifico los dos subconjuntos # --------------------------------------- resultado <- rbind(data1.new, data2.new) resultado$edad_final <- unclass(round(difftime(resultado$final, resultado$nacim, units="auto")/365.25,1)) return(resultado) } # FINAL DE LA FUNCIÓN Mis dudas son dos: 1) La función aplicada sobre el data frame dd no funciona, y me sale el siguiente aviso: Error en rbind(deparse.level, ...) : numbers of columns of arguments do not match 2) ¿Cómo puedo incluir también como argumento de la función la fecha que desee? (Es decir, en el caso anteruior era la fecha 01-01-2006, pero podría ser otra) GRACIAS A TODOS POR VUESTRA AYUDA (si alguien considera algún punto claramente mejorable de la programación, le ruego que me lo diga). ¡Muchas gracias! [[alternative HTML version deleted]]
"Marcuzzi, Javier Rubén"
2014-Apr-10 18:15 UTC
[R-es] Unión de subconjuntos procedentes de bucles
Estimado Francisco Javier En los casos en que utilizo fechas, suelo hacer dos cosas. Por un lado contar días a partir de una fecha seleccionada, tendría que ser lo misno que usar dos fechas, pero los resultados pueden ser los No esperados, habría que ver la versión actual de R que creo que saldría hoy, pero hay dolores de cabeza al respecto. Por otro lado si es posible trabajar con sql prefiero esta opción, porque en mi mente me es más sencillo pensar en algún lenguaje de consulta para hacer las consultas y en un lenguaje estadístico para las estadísticas. Usted utiliza difftime, viendo sus datos, id, sexo, nacim, origen, final, posiblemente accesa a datos de animales, si es así, en mi caso al accedar a datos de bovinos, lo que funcionaba en R cuándo preparaba el código al llevarlo a los datos reales fracasaba, no pregunte porqué porque nunca supe la respuesta, me rompi de cabeza hasta que, eliminando parte me mi código, lo referido al trabajo con fechas queda: strptime(Animales$Nacimiento, format="%d/%m/%Y") calculo <- datos$fecha - datos$Inicio calculo2 <- as.numeric(calculo, units="days") En resumen, yo prefiero sql para algunos trabajos, y difftime me daba errores y lo que me funciono es algo más extenso al código que expuse, pero básicamente es la parte que le puede interesar. Javier Marcuzzi El 10/04/2014 02:14 p.m., Francisco Javier escribió:> Buenas tardes a todos los participantes del foro. > Me dirijo a vosotros porque estoy atascado con una duda de programación respecto al data frame: > > >> dd # Data frame de 5 variables, leído de un archivo txt > id sexo nacim origen final > 1 1 0 02/09/1955 01/04/1985 01/02/2014 > 2 2 1 29/10/1951 15/08/1996 01/05/2009 > 3 3 0 30/10/1942 02/08/2000 01/02/2014 > 4 4 1 22/05/1932 25/02/1993 01/03/2011 > 5 5 0 29/12/1942 22/06/2007 01/07/2012 > 6 6 1 18/11/1935 07/08/2010 01/01/2014 > > A este data frame (cuya variable sexo ya está factorizada y cuyas otras variables ya están en formato de fecha) le quiero aplicar el siguiente código : > > conv <- function(data, edad_u=65) > { # INICIO DE LA FUNCIÓN > > # Elimino individuos que tienen una edad_final < edat_u años > # =========================================================> data$edad_final <- unclass(round(difftime(data$final, data$nacim, units="auto")/365.25,1)) > data <- data[data$edad_final> edad_u,] > data$edad_final <- NULL # Elimino provisionalmente la variable edad_final > > # Con los datos que quedan, distingo 2 situaciones: > # 1) La fecha de "origen" es anterior ó igual a: 01-01-2006 > # 2) La fecha de "origen" es posterior a: 01-01-2006 > # =========================================================> for (i in 1:length(data$origen)) { > # Fecha de origen anterior o igual al 01-01-2006: > # ----------------------------------------------- > if ((data$origen[i]) <= as.Date("2006-01-01")) { > # Creo para este subconjunto la variable temporal "edad_2006" > data$edad_2006 <- unclass(round(difftime('2006-01-01', data$nacim, units="auto")/365.25,1)) > menor_t_2006 <- data[data$edad_2006 <= edad_u,] > menor_t_2006$edad_ent <- edad_u > mayor_t_2006 <- data[data$edad_2006 > edad_u,] > mayor_t_2006$edad_ent <- unclass(round(difftime('2006-01-01', > mayor_t_2006$nacim, units="auto")/365.25,1)) > data1.new <- rbind(menor_t_2006, mayor_t_2006) > data1.new <- data1.new[,-which(names(data1.new) %in% c('edad_2006'))] > } > # Fecha de origen posterior al 01-01-2006: > # ---------------------------------------- > else if(data$origen[i] > as.Date('2006-01-01')) { > # Creo para este otro subconjunto la variable temporal "edad_origen" > data$edad_origen <- unclass(round(difftime(data$origen, > data$nacim, units="auto")/365.25,1)) > menor_t_origen <- data[data$edad_origen <= edad_u,] > menor_t_origen$edad_ent <- edad_u > mayor_t_origen <- data[data$edad_origen > edad_u,] > mayor_t_origen$edad_ent <- unclass(round(difftime(mayor_t_origen$origen, > mayor_t_origen$nacim, units="auto")/365.25,1)) > data2.new <- rbind(menor_t_origen, mayor_t_origen) > data2.new <- data2.new[,-which(names(data2.new) %in% c('edad_origen'))] > } > } > # Resultado: Unifico los dos subconjuntos > # --------------------------------------- > resultado <- rbind(data1.new, data2.new) > resultado$edad_final <- unclass(round(difftime(resultado$final, > resultado$nacim, units="auto")/365.25,1)) > return(resultado) > } # FINAL DE LA FUNCIÓN > > Mis dudas son dos: > > 1) La función aplicada sobre el data frame dd no funciona, y me sale el siguiente aviso: > Error en rbind(deparse.level, ...) : > numbers of columns of arguments do not match > > 2) ¿Cómo puedo incluir también como argumento de la función la fecha que desee? (Es decir, > en el caso anteruior era la fecha 01-01-2006, pero podría ser otra) > > GRACIAS A TODOS POR VUESTRA AYUDA (si alguien considera algún punto claramente mejorable de la programación, le ruego que me lo diga). ¡Muchas gracias! > > > > > [[alternative HTML version deleted]] > > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es[[alternative HTML version deleted]]
Francisco, Me parece que el problema es que data1.new y data2.new tienen diferente cantidad de columnas, Prueba data2.new[, -lacolumnaqueestademás] . Respecto de 2 incluye la fecha como un character, digamos y luego lo conviertes a fecha as.Date("Origen") Espero te sirva, Daniel Merino El 10 de abril de 2014, 14:14, Francisco Javier <iterador10@hotmail.com>escribió:> Buenas tardes a todos los participantes del foro. > Me dirijo a vosotros porque estoy atascado con una duda de programación > respecto al data frame: > > > > dd # Data frame de 5 variables, leído de un archivo txt > id sexo nacim origen final > 1 1 0 02/09/1955 01/04/1985 01/02/2014 > 2 2 1 29/10/1951 15/08/1996 01/05/2009 > 3 3 0 30/10/1942 02/08/2000 01/02/2014 > 4 4 1 22/05/1932 25/02/1993 01/03/2011 > 5 5 0 29/12/1942 22/06/2007 01/07/2012 > 6 6 1 18/11/1935 07/08/2010 01/01/2014 > > A este data frame (cuya variable sexo ya está factorizada y cuyas otras > variables ya están en formato de fecha) le quiero aplicar el siguiente > código : > > conv <- function(data, edad_u=65) > { # INICIO DE LA FUNCIÓN > > # Elimino individuos que tienen una edad_final < edat_u años > # =========================================================> data$edad_final <- unclass(round(difftime(data$final, data$nacim, > units="auto")/365.25,1)) > data <- data[data$edad_final> edad_u,] > data$edad_final <- NULL # Elimino provisionalmente la variable edad_final > > # Con los datos que quedan, distingo 2 situaciones: > # 1) La fecha de "origen" es anterior ó igual a: 01-01-2006 > # 2) La fecha de "origen" es posterior a: 01-01-2006 > # =========================================================> for (i in 1:length(data$origen)) { > # Fecha de origen anterior o igual al 01-01-2006: > # ----------------------------------------------- > if ((data$origen[i]) <= as.Date("2006-01-01")) { > # Creo para este subconjunto la variable temporal "edad_2006" > data$edad_2006 <- unclass(round(difftime('2006-01-01', data$nacim, > units="auto")/365.25,1)) > menor_t_2006 <- data[data$edad_2006 <= edad_u,] > menor_t_2006$edad_ent <- edad_u > mayor_t_2006 <- data[data$edad_2006 > edad_u,] > mayor_t_2006$edad_ent <- unclass(round(difftime('2006-01-01', > mayor_t_2006$nacim, units="auto")/365.25,1)) > data1.new <- rbind(menor_t_2006, mayor_t_2006) > data1.new <- data1.new[,-which(names(data1.new) %in% c('edad_2006'))] > } > # Fecha de origen posterior al 01-01-2006: > # ---------------------------------------- > else if(data$origen[i] > as.Date('2006-01-01')) { > # Creo para este otro subconjunto la variable temporal "edad_origen" > data$edad_origen <- unclass(round(difftime(data$origen, > data$nacim, units="auto")/365.25,1)) > menor_t_origen <- data[data$edad_origen <= edad_u,] > menor_t_origen$edad_ent <- edad_u > mayor_t_origen <- data[data$edad_origen > edad_u,] > mayor_t_origen$edad_ent <- > unclass(round(difftime(mayor_t_origen$origen, > mayor_t_origen$nacim, units="auto")/365.25,1)) > data2.new <- rbind(menor_t_origen, mayor_t_origen) > data2.new <- data2.new[,-which(names(data2.new) %in% c('edad_origen'))] > } > } > # Resultado: Unifico los dos subconjuntos > # --------------------------------------- > resultado <- rbind(data1.new, data2.new) > resultado$edad_final <- unclass(round(difftime(resultado$final, > resultado$nacim, units="auto")/365.25,1)) > return(resultado) > } # FINAL DE LA FUNCIÓN > > Mis dudas son dos: > > 1) La función aplicada sobre el data frame dd no funciona, y me sale el > siguiente aviso: > Error en rbind(deparse.level, ...) : > numbers of columns of arguments do not match > > 2) ¿Cómo puedo incluir también como argumento de la función la fecha que > desee? (Es decir, > en el caso anteruior era la fecha 01-01-2006, pero podría ser otra) > > GRACIAS A TODOS POR VUESTRA AYUDA (si alguien considera algún punto > claramente mejorable de la programación, le ruego que me lo diga). ¡Muchas > gracias! > > > > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- Daniel [[alternative HTML version deleted]]
"Marcuzzi, Javier Rubén"
2014-Apr-10 19:55 UTC
[R-es] Unión de subconjuntos procedentes de bucles
Daniel y Francisco as.Date(), a mi supo darme errores, teoricamente R se ejecuta, pero como por suerte yo tenía acceso a los datos originales (y los animales en los campos), por una extraña causa algunas fechas no correspondían a la realidad, no pregunten donde estaba el error porque nunca lo encontre. Posiblemente a la fecha de hoy con las actualizaciónes de R ese inconveniente no esta, pero ..., habría que probarlo. as.Date está en varias librería, sería buena opción, pero a mi me trajo problemas y demoras en la entrega de mi análisis a la consultora que me contrato para ese caso. Sobre la cantidad de columnas, y el rbind, para evitar ese tipo de errores a mi me resulta más sencillo sql, pero solo por mi forma de pensar, como también me gusta más "No usar 365.25" en los cálculos de fechas, me gusta más las posibilidades como http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html, que se puede usar con Rmysql o desde mysql y exportar los datos a R, pero claro que esta es solo una forma de trabajar (sqldf, otras opciónes , etc.). Javier Marcuzzi El 10/04/2014 04:17 p.m., daniel escribió:> Francisco, > > Me parece que el problema es que data1.new y data2.new tienen diferente > cantidad de columnas, Prueba data2.new[, -lacolumnaqueestademás] . > > Respecto de 2 incluye la fecha como un character, digamos y luego lo > conviertes a fecha as.Date("Origen") > > Espero te sirva, > > Daniel Merino > > > El 10 de abril de 2014, 14:14, Francisco Javier > <iterador10@hotmail.com>escribió: > >> Buenas tardes a todos los participantes del foro. >> Me dirijo a vosotros porque estoy atascado con una duda de programación >> respecto al data frame: >> >> >>> dd # Data frame de 5 variables, leído de un archivo txt >> id sexo nacim origen final >> 1 1 0 02/09/1955 01/04/1985 01/02/2014 >> 2 2 1 29/10/1951 15/08/1996 01/05/2009 >> 3 3 0 30/10/1942 02/08/2000 01/02/2014 >> 4 4 1 22/05/1932 25/02/1993 01/03/2011 >> 5 5 0 29/12/1942 22/06/2007 01/07/2012 >> 6 6 1 18/11/1935 07/08/2010 01/01/2014 >> >> A este data frame (cuya variable sexo ya está factorizada y cuyas otras >> variables ya están en formato de fecha) le quiero aplicar el siguiente >> código : >> >> conv <- function(data, edad_u=65) >> { # INICIO DE LA FUNCIÓN >> >> # Elimino individuos que tienen una edad_final < edat_u años >> # =========================================================>> data$edad_final <- unclass(round(difftime(data$final, data$nacim, >> units="auto")/365.25,1)) >> data <- data[data$edad_final> edad_u,] >> data$edad_final <- NULL # Elimino provisionalmente la variable edad_final >> >> # Con los datos que quedan, distingo 2 situaciones: >> # 1) La fecha de "origen" es anterior ó igual a: 01-01-2006 >> # 2) La fecha de "origen" es posterior a: 01-01-2006 >> # =========================================================>> for (i in 1:length(data$origen)) { >> # Fecha de origen anterior o igual al 01-01-2006: >> # ----------------------------------------------- >> if ((data$origen[i]) <= as.Date("2006-01-01")) { >> # Creo para este subconjunto la variable temporal "edad_2006" >> data$edad_2006 <- unclass(round(difftime('2006-01-01', data$nacim, >> units="auto")/365.25,1)) >> menor_t_2006 <- data[data$edad_2006 <= edad_u,] >> menor_t_2006$edad_ent <- edad_u >> mayor_t_2006 <- data[data$edad_2006 > edad_u,] >> mayor_t_2006$edad_ent <- unclass(round(difftime('2006-01-01', >> mayor_t_2006$nacim, units="auto")/365.25,1)) >> data1.new <- rbind(menor_t_2006, mayor_t_2006) >> data1.new <- data1.new[,-which(names(data1.new) %in% c('edad_2006'))] >> } >> # Fecha de origen posterior al 01-01-2006: >> # ---------------------------------------- >> else if(data$origen[i] > as.Date('2006-01-01')) { >> # Creo para este otro subconjunto la variable temporal "edad_origen" >> data$edad_origen <- unclass(round(difftime(data$origen, >> data$nacim, units="auto")/365.25,1)) >> menor_t_origen <- data[data$edad_origen <= edad_u,] >> menor_t_origen$edad_ent <- edad_u >> mayor_t_origen <- data[data$edad_origen > edad_u,] >> mayor_t_origen$edad_ent <- >> unclass(round(difftime(mayor_t_origen$origen, >> mayor_t_origen$nacim, units="auto")/365.25,1)) >> data2.new <- rbind(menor_t_origen, mayor_t_origen) >> data2.new <- data2.new[,-which(names(data2.new) %in% c('edad_origen'))] >> } >> } >> # Resultado: Unifico los dos subconjuntos >> # --------------------------------------- >> resultado <- rbind(data1.new, data2.new) >> resultado$edad_final <- unclass(round(difftime(resultado$final, >> resultado$nacim, units="auto")/365.25,1)) >> return(resultado) >> } # FINAL DE LA FUNCIÓN >> >> Mis dudas son dos: >> >> 1) La función aplicada sobre el data frame dd no funciona, y me sale el >> siguiente aviso: >> Error en rbind(deparse.level, ...) : >> numbers of columns of arguments do not match >> >> 2) ¿Cómo puedo incluir también como argumento de la función la fecha que >> desee? (Es decir, >> en el caso anteruior era la fecha 01-01-2006, pero podría ser otra) >> >> GRACIAS A TODOS POR VUESTRA AYUDA (si alguien considera algún punto >> claramente mejorable de la programación, le ruego que me lo diga). ¡Muchas >> gracias! >> >> >> >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> > > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es[[alternative HTML version deleted]]