2015-09-18 21 views
5

Ho difficoltà ad applicare una funzione a ogni membro di un data.table. Ecco un esempio semplificato:Applicare la funzione strptime a ogni membro di un data.table

dt <- data.table(a= c("30JAN14:23:16:00","23MAY12:02:00:00"), 
        b=c("03AUG09:00:00:00","13JUN12:02:00:00"), 
        c=c("31JAN14:15:19:00","23MAY12:00:00:00")) 

strptime(dt[1,1,with=FALSE], "%d%B%y:%H:%M:%S") 

rendimenti "2014-01-30 23:16:00 PST"

Ma quando tento di applicarla in tutto il data.table non ottengo quello che sto cercando e ricevere messaggi accusatorie.

cols <- c("a","b","c") 
dt[, (cols):=sapply(.SD, function(x) strptime(x, "%d%B%y:%H:%M:%S")),.SDcols=cols] 
+0

I tuoi problemi non erano con la sintassi data.table ma piuttosto con la scelta della funzione da applicare. –

risposta

8

strptime rendimenti classe POSIXlt che è in realtà un elenco che spiega il motivo per cui utilizzarlo all'interno sia data.table o data.frame oggetti crea problemi:

> dt[, (cols):=lapply(.SD, function(x) as.POSIXct(strptime(x, "%d%B%y:%H:%M:%S"))),.SDcols=cols] 
> dt 
        a     b     c 
1: 2014-01-30 23:16:00 2009-08-03 00:00:00 2014-01-31 15:19:00 
2: 2012-05-23 02:00:00 2012-06-13 02:00:00 2012-05-23 00:00:00 
+0

questa è la risposta migliore, questo restituisce colonne di classe '" POSIXct "' mentre il mio restituisce colonne di caratteri – Jaap

4

È anche possibile utilizzare as.IDate e as.ITime invece di strptime. Inoltre, è meglio lapply:

dt[, (cols):=lapply(.SD, function(x) paste(as.IDate(x, "%d%B%y:%H:%M:%S"), 
              as.ITime(x, "%d%B%y:%H:%M:%S"), 
              sep=" ")), 
    .SDcols=cols] 

questo dà:

> dt 
        a     b     c 
1: 2014-01-30 23:16:00 2009-08-03 00:00:00 2014-01-31 15:19:00 
2: 2012-05-23 02:00:00 2012-06-13 02:00:00 2012-05-23 00:00:00 
+0

grazie per aver portato queste funzioni alla mia attenzione – Kerry

+0

Congratulazioni per aver raggiunto 10k! – akrun