2011-11-14 3 views
12

Mi segunda pregunta del día y mi último intento de usar R para limpiar esta información. Aquí está el informe:Extraiga elementos de fecha de POSIXlt y colóquelos en el marco de datos en R

Tengo un marco de datos que tiene una columna que es un tipo de fecha POSIXlt. Quiero extraer el día, mes y año de esa columna y crear 3 nuevas columnas llamadas (hábilmente) día, mes y año.

La trama de datos tiene el siguiente aspecto:

order_id  dd_mmm_yy 
    1   2005-07-28 
    2   2007-03-04 

Quiero terminar con esto:

order_id  dd_mmm_yy day month year 
    1   2005-07-28 28  7  2005 
    2   2007-03-04 4  3  2007 

He creado una función para extraer el día, el mes y el año y devolverlos en una lista (o marco de datos, lo he intentado ambos).

extractdate = function (date) { 
     day = format(date, format="%d") 
     month = format(date, format="%m") 
     year = format(date, format="%Y") 

     list(day=day, month=month, year=year) 
} 

Esto es lo que he tratado en base a un problema anterior y pregunta:

cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate))) 

que me da esto:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 5, 9 

El t (sapply ... por sí mismo da esto por alguna razón loca:

 day   month  year  
sec Character,5 Character,5 Character,5 
min Character,5 Character,5 Character,5 
hour Character,5 Character,5 Character,5 
mday Character,5 Character,5 Character,5 
mon Character,5 Character,5 Character,5 
year Character,5 Character,5 Character,5 
wday Character,5 Character,5 Character,5 
yday Character,5 Character,5 Character,5 
isdst Character,5 Character,5 Character,5 

Wh en la tierra está sucediendo? ¿Sería mejor utilizar algo como Python o Java para hacer toda la manipulación de datos que necesito hacer con estos datos antes de incluirlos en R para su análisis?

Respuesta

21

POSIXlt objetos son una lista de 9 componentes (véase la sección Detalles de ?POSIXlt para más información). Como la columna dd_mmm_yy es POSIXlt, no necesita una función para extraer los componentes. Usted puede simplemente extraer los componentes por sus nombres:

orders$day <- orders$dd_mmm_yy$mday  # day of month 
orders$month <- orders$dd_mmm_yy$mon+1  # month of year (zero-indexed) 
orders$year <- orders$dd_mmm_yy$year+1900 # years since 1900 
orders 
# order_id dd_mmm_yy day month year 
# 1  1 2005-07-28 28  7 2005 
# 2  2 2007-03-04 4  3 2007 
+0

Gracias! Eso funcionó perfectamente. Sabía que tenía que haber una solución simple. –

+0

Hay un problema con esta solución, verifique a continuación. – mmann1123

+0

@ user1034797: no hay ningún problema con esta solución. Usted supone que cambio los elementos de un objeto POSIXlt, lo que no hago. –

2

probar este (DF como su hoja.de.datos):

extractdate <- function(date) { 
    day <- format(date, format="%d") 
    month <- format(date, format="%m") 
    year <- format(date, format="%Y") 

    cbind(day, month, year) 
} 

cbind(DF, extractdate(DF$dd_mmm_yy)) 
9

Un revestimiento utilizando lubridate

require(plyr); require(lubridate) 
mutate(mydf, date = ymd(dd_mmm_yy), day = day(date), 
    month = month(date), year = year(date)) 

    order_id dd_mmm_yy  date day month year 
1  1 2005-07-28 2005-07-28 28  7 2005 
2  2 2007-03-04 2007-03-04 4  3 2007 
Cuestiones relacionadas