2015-09-18 12 views
5

Mam problem z zastosowaniem funkcji do każdego elementu tabeli data.table. Oto uproszczony przykład:Zastosuj funkcję strptime do każdego elementu tabeli 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") 

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

Ale gdy próbuję zastosować ją w poprzek data.table Nie rozumiem co szukam i odbierać oskarżycielski wiadomości.

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

Twoje problemy nie wynikały ze składni data.table, ale z wyboru funkcji do zastosowania. –

Odpowiedz

8

strptime klasa powraca POSIXlt który w rzeczywistości jest lista, która wyjaśnia, dlaczego go używać wewnątrz albo data.table lub data.frame obiektów stwarza problemy:

> 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

to jest lepsza odpowiedź, to zwraca kolumny klasy '" POSIXct "', podczas gdy moje zwraca kolumny znaków – Jaap

4

Można również użyć as.IDate i as.ITime zamiast strptime. Ponadto lapply jest lepsze:

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] 

to daje:

> 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

dziękuję za zwrócenie mojej uwagi na te funkcje. – Kerry

+0

Gratulacje za osiągnięcie 10 tys. – akrun

Powiązane problemy