Hola. Tengo una duda con esta sintaxis. Tengo una variable con formato Date que por algún motivo (el data.table viene de una consulta con PostgreSQL): datos <- prov[, pprid, pprfecbaja] str(datos) Cuando intento quitar las fechas de bajas inválidas (0001-01-01) y convertirlas a NA, la variable resultante "pierde" su condición de Date. Probé con distintas formas, siempre con el mismo resultado: datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, datos$pprfecbaja) datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, as.Date(datos$pprfecbaja)) datos$pprfecbaja <- ifelse(year(datos$pprfecbaja) < 1994, NA, as.Date(datos$pprfecbaja)) ¿Podrían por favor ayudarme a correr la sintaxis correcta? Adjunto los datos de ejemplo. ?Muchas gracias.? -- Mauricio ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170216/fdd5895c/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: datos.csv Type: text/csv Size: 65155 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170216/fdd5895c/attachment-0001.bin>
Hola, Así funciona... #-------------------------------- library(lubridate) datos <- read.table("datos.csv", header = TRUE, sep = ";", as.is = TRUE) #Primero quito fechas malas datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, datos$pprfecbaja) # Convierto campo fechas en clase Date datos$pprfecbaja <- ymd(datos$pprfecbaja) # Comprobacion de la clase tail(datos) class(datos$pprfecbaja[2808]) #-------------------------------- Saludos, Carlos Ortega www.qualityexcellence.es El 16 de febrero de 2017, 13:34, Mauricio Monsalvo <m.monsalvo en gmail.com> escribió:> Hola. > Tengo una duda con esta sintaxis. Tengo una variable con formato Date que > por algún motivo (el data.table viene de una consulta con PostgreSQL): > datos <- prov[, pprid, pprfecbaja] > str(datos) > Cuando intento quitar las fechas de bajas inválidas (0001-01-01) y > convertirlas a NA, la variable resultante "pierde" su condición de Date. > Probé con distintas formas, siempre con el mismo resultado: > datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, > datos$pprfecbaja) > datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, > as.Date(datos$pprfecbaja)) > datos$pprfecbaja <- ifelse(year(datos$pprfecbaja) < 1994, NA, > as.Date(datos$pprfecbaja)) > ¿Podrían por favor ayudarme a correr la sintaxis correcta? > Adjunto los datos de ejemplo. > ?Muchas gracias.? > > -- > Mauricio > > _______________________________________________ > 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]]
Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170216/5ed5e3f1/attachment.html>
?Hola.? 2017-02-16 9:34 GMT-03:00 Mauricio Monsalvo <m.monsalvo en gmail.com>:> ¿Podrían por favor ayudarme a correr la sintaxis correcta?Esta es otra opción: ?datos<-read.csv('datos.csv', sep=';', row.names=1)> ??datos$pprfecbaja<-? replace(as.Date(datos$pprfecbaja), > datos$pprfecbaja=="0001-01-01", NA)?Saludos.? -- «Pídeles sus títulos a los que te persiguen, pregúntales cuándo nacieron, diles que te demuestren su existencia.» Rafael Cadenas [[alternative HTML version deleted]]
Excelente! Muchas gracias a todos!! Saludos. El 16 de febrero de 2017, 13:06, Freddy Omar López Quintero < freddy.lopez.quintero en gmail.com> escribió:> ?Hola.? > > 2017-02-16 9:34 GMT-03:00 Mauricio Monsalvo <m.monsalvo en gmail.com>: > >> ¿Podrían por favor ayudarme a correr la sintaxis correcta? > > > Esta es otra opción: > > ?datos<-read.csv('datos.csv', sep=';', row.names=1) >> ??datos$pprfecbaja<-? replace(as.Date(datos$pprfecbaja), >> datos$pprfecbaja=="0001-01-01", NA) > > > ?Saludos.? > > > -- > «Pídeles sus títulos a los que te persiguen, pregúntales > cuándo nacieron, diles que te demuestren su existencia.» > > Rafael Cadenas > >-- Mauricio [[alternative HTML version deleted]]
Carlos, probé en primer lugar tu propuesta. Pero: as.data.table(datos)[, .N, by=pprfecbaja] pprfecbaja N 1: 0001-01-01 2000 2: 1994-08-26 20 3: 2005-07-06 585 4: 2005-03-07 29 5: 2004-03-23 33 6: 2004-10-18 1 7: 1997-09-01 9 8: 1997-09-04 16 9: 1996-05-29 3 ... datos$pprfecbaja <- ymd(datos$pprfecbaja) Warning message: 764 failed to parse.> as.data.table(datos)[, .N, by=pprfecbaja]pprfecbaja N 1: <NA> 2770 2: 2001-01-05 9 3: 2001-01-08 16 4: 2001-01-07 7 5: 2001-09-07 1 6: 2001-05-12 1 7: 2001-10-22 1 8: 2001-12-27 1 9: 2001-08-20 1 10: 2001-03-09 1 Es decir, ymd() lleva todos los datos a unas fechas que no existen, todas del año 2001. Por otro lado, la opción de Gerar: datos$pprfecbaja<-strptime(datos$pprfecbaja, "%Y-%m-%d") ##transformar la variable de formato Character a formato POSIXlt Warning messages: 1: In `[<-.data.table`(x, j = name, value = value) : Supplied 11 items to be assigned to 2808 items of column 'pprfecbaja' (recycled leaving remainder of 3 items). 2: In `[<-.data.table`(x, j = name, value = value) : Coerced 'list' RHS to 'character' to match the column's type. Either change the target column to 'list' first (by creating a new 'list' vector length 2808 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'character' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please. Da valores raros a las celdas, algo así como (el print sale truncado): c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ... 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) Finlmente, la opción de Freddy *andó:* datos$pprfecbaja<-replace(as.Date(datos$pprfecbaja), datos$pprfecbaja=="0001-01-01", NA) as.data.table(datos)[, .N, by=pprfecbaja] pprfecbaja N 1: <NA> 2006 2: 1994-08-26 20 3: 2005-07-06 585 4: 2005-03-07 29 5: 2004-03-23 33 6: 2004-10-18 1 7: 1997-09-01 9 8: 1997-09-04 16 9: 1996-05-29 3 10: 1997-09-03 7 El 16 de febrero de 2017, 12:43, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola, > > Así funciona... > > #-------------------------------- > > library(lubridate) > datos <- read.table("datos.csv", header = TRUE, sep = ";", as.is = TRUE) > #Primero quito fechas malas > datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, > datos$pprfecbaja) > > # Convierto campo fechas en clase Date > datos$pprfecbaja <- ymd(datos$pprfecbaja) > > # Comprobacion de la clase > tail(datos) > class(datos$pprfecbaja[2808]) > > #-------------------------------- > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 16 de febrero de 2017, 13:34, Mauricio Monsalvo <m.monsalvo en gmail.com> > escribió: > >> Hola. >> Tengo una duda con esta sintaxis. Tengo una variable con formato Date que >> por algún motivo (el data.table viene de una consulta con PostgreSQL): >> datos <- prov[, pprid, pprfecbaja] >> str(datos) >> Cuando intento quitar las fechas de bajas inválidas (0001-01-01) y >> convertirlas a NA, la variable resultante "pierde" su condición de Date. >> Probé con distintas formas, siempre con el mismo resultado: >> datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, >> datos$pprfecbaja) >> datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, >> as.Date(datos$pprfecbaja)) >> datos$pprfecbaja <- ifelse(year(datos$pprfecbaja) < 1994, NA, >> as.Date(datos$pprfecbaja)) >> ¿Podrían por favor ayudarme a correr la sintaxis correcta? >> Adjunto los datos de ejemplo. >> ?Muchas gracias.? >> >> -- >> Mauricio >> >> _______________________________________________ >> 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 >-- Mauricio [[alternative HTML version deleted]]
Esa opción funcionó perfectamente bien! Y es cómoda y directa. Gracias, Carlos! El 16 de febrero de 2017, 15:49, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola, > > Realmente mi código hacía primero una conversión a "NA" de las fechas > malas y luego una conversión a fecha con "ymd()"... > Con data.table lo puedes hacer así: > > > datos[ , new_fech := ifelse(pprfecbaja=="0001-01-01", NA, pprfecbaja)][, > new_fech := ymd(new_fech)] > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 16 de febrero de 2017, 17:23, Mauricio Monsalvo <m.monsalvo en gmail.com> > escribió: > >> Carlos, probé en primer lugar tu propuesta. Pero: >> as.data.table(datos)[, .N, by=pprfecbaja] >> pprfecbaja N >> 1: 0001-01-01 2000 >> 2: 1994-08-26 20 >> 3: 2005-07-06 585 >> 4: 2005-03-07 29 >> 5: 2004-03-23 33 >> 6: 2004-10-18 1 >> 7: 1997-09-01 9 >> 8: 1997-09-04 16 >> 9: 1996-05-29 3 >> ... >> datos$pprfecbaja <- ymd(datos$pprfecbaja) >> Warning message: >> 764 failed to parse. >> > as.data.table(datos)[, .N, by=pprfecbaja] >> pprfecbaja N >> 1: <NA> 2770 >> 2: 2001-01-05 9 >> 3: 2001-01-08 16 >> 4: 2001-01-07 7 >> 5: 2001-09-07 1 >> 6: 2001-05-12 1 >> 7: 2001-10-22 1 >> 8: 2001-12-27 1 >> 9: 2001-08-20 1 >> 10: 2001-03-09 1 >> Es decir, ymd() lleva todos los datos a unas fechas que no existen, todas >> del año 2001. >> >> Por otro lado, la opción de Gerar: >> datos$pprfecbaja<-strptime(datos$pprfecbaja, "%Y-%m-%d") ##transformar >> la variable de formato Character a formato POSIXlt >> Warning messages: >> 1: In `[<-.data.table`(x, j = name, value = value) : >> Supplied 11 items to be assigned to 2808 items of column 'pprfecbaja' >> (recycled leaving remainder of 3 items). >> 2: In `[<-.data.table`(x, j = name, value = value) : >> Coerced 'list' RHS to 'character' to match the column's type. Either >> change the target column to 'list' first (by creating a new 'list' vector >> length 2808 (nrows of entire table) and assign that; i.e. 'replace' >> column), or coerce RHS to 'character' (e.g. 1L, NA_[real|integer]_, as.*, >> etc) to make your intent clear and for speed. Or, set the column type >> correctly up front when you create the table and stick to it, please. >> Da valores raros a las celdas, algo así como (el print sale truncado): >> c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ... 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) >> >> Finlmente, la opción de Freddy *andó:* >> datos$pprfecbaja<-replace(as.Date(datos$pprfecbaja), >> datos$pprfecbaja=="0001-01-01", NA) >> as.data.table(datos)[, .N, by=pprfecbaja] >> pprfecbaja N >> 1: <NA> 2006 >> 2: 1994-08-26 20 >> 3: 2005-07-06 585 >> 4: 2005-03-07 29 >> 5: 2004-03-23 33 >> 6: 2004-10-18 1 >> 7: 1997-09-01 9 >> 8: 1997-09-04 16 >> 9: 1996-05-29 3 >> 10: 1997-09-03 7 >> >> El 16 de febrero de 2017, 12:43, Carlos Ortega <cof en qualityexcellence.es> >> escribió: >> >>> Hola, >>> >>> Así funciona... >>> >>> #-------------------------------- >>> >>> library(lubridate) >>> datos <- read.table("datos.csv", header = TRUE, sep = ";", as.is = TRUE) >>> #Primero quito fechas malas >>> datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, >>> datos$pprfecbaja) >>> >>> # Convierto campo fechas en clase Date >>> datos$pprfecbaja <- ymd(datos$pprfecbaja) >>> >>> # Comprobacion de la clase >>> tail(datos) >>> class(datos$pprfecbaja[2808]) >>> >>> #-------------------------------- >>> >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> El 16 de febrero de 2017, 13:34, Mauricio Monsalvo <m.monsalvo en gmail.com >>> > escribió: >>> >>>> Hola. >>>> Tengo una duda con esta sintaxis. Tengo una variable con formato Date >>>> que por algún motivo (el data.table viene de una consulta con PostgreSQL): >>>> datos <- prov[, pprid, pprfecbaja] >>>> str(datos) >>>> Cuando intento quitar las fechas de bajas inválidas (0001-01-01) y >>>> convertirlas a NA, la variable resultante "pierde" su condición de Date. >>>> Probé con distintas formas, siempre con el mismo resultado: >>>> datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, >>>> datos$pprfecbaja) >>>> datos$pprfecbaja <- ifelse(datos$pprfecbaja=="0001-01-01", NA, >>>> as.Date(datos$pprfecbaja)) >>>> datos$pprfecbaja <- ifelse(year(datos$pprfecbaja) < 1994, NA, >>>> as.Date(datos$pprfecbaja)) >>>> ¿Podrían por favor ayudarme a correr la sintaxis correcta? >>>> Adjunto los datos de ejemplo. >>>> ?Muchas gracias.? >>>> >>>> -- >>>> Mauricio >>>> >>>> _______________________________________________ >>>> 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 >>> >> >> >> >> -- >> Mauricio >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >-- Mauricio [[alternative HTML version deleted]]