2015-09-18 23 views
5

我無法將函數應用於data.table的每個成員。下面是一個簡單的例子:將strptime函數應用於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") 

回報"2014-01-30 23:16:00 PST"

但是,當我試圖跨越data.table應用它,我不明白我正在尋找和接受指責的消息。

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

你的問題不是data.table語法,而是選擇要應用的函數。 –

回答

8

strptime收益類POSIXlt這實際上是這解釋了爲什麼使用它或者data.table或data.frame對象中的列表產生問題:

> 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

這是更好的答案,它返回類「POSIXct」的列,而礦返回字符列 – Jaap

4

您還可以使用as.IDateas.ITime而不是strptime。此外,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] 

這給:

> 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

感謝您將這些功能引起我的注意 – Kerry

+0

恭喜達到10k! – akrun

相關問題