2011-11-14 14 views
12

La seconda domanda del giorno e il mio ultimo tentativo di utilizzare R per pulire questi dati. Ecco il sitrep:Estrarre gli elementi di data da POSIXlt e inserirli nel frame di dati in R

Ho un frame di dati che ha una colonna che è un tipo di data POSIXlt. Voglio estrarre il giorno, il mese e l'anno da quella colonna e creare 3 nuove colonne chiamate (intelligentemente) giorno, mese e anno.

La cornice di dati si presenta così:

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

Voglio finire con questo:

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

ho creato una funzione per estrarre il giorno, il mese e l'anno e restituirli in una lista (o in una cornice dati, ho provato entrambi).

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) 
} 

Ecco che cosa ho provato in base a un problema di precedenza e domanda:

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

che mi dà questo:

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

La t (sapply ... da sola dà me questo per qualche motivo folle:

 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 sulla terra sta succedendo? Sto meglio usando qualcosa come Python o Java per fare tutta la manipolazione dei dati che devo fare su questi dati prima di portarli in R per l'analisi?

risposta

21

POSIXlt oggetti sono un elenco di 9 componenti (vedere la sezione Dettagli di ?POSIXlt per maggiori informazioni). Poiché la colonna dd_mmm_yy è POSIXlt, non è necessaria una funzione per estrarre i componenti. Si può solo estrarre i componenti con i loro nomi:

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

Grazie! Ha funzionato perfettamente. Sapevo che doveva esserci una soluzione semplice. –

+0

C'è un problema con questa soluzione, controlla sotto. – mmann1123

+0

@ user1034797: non ci sono problemi con questa soluzione. Supponi di cambiare gli elementi di un oggetto POSIXlt, cosa che non faccio. –

2

Prova questa (DF come data.frame):

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

uno di linea utilizzando 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 
Problemi correlati