2015-09-18 15 views
5

Tôi gặp sự cố khi áp dụng chức năng cho mọi thành viên của data.table. Dưới đây là một ví dụ đơn giản:Áp dụng chức năng strptime cho mọi thành viên của một 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") 

lợi nhuận "2014-01-30 23:16:00 PST"

Nhưng khi tôi cố gắng để áp dụng nó trên data.table Tôi không hiểu những gì tôi đang tìm kiếm và nhận tin nhắn trách móc.

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

Các vấn đề của bạn không phải với cú pháp data.table mà là lựa chọn hàm để áp dụng. –

Trả lời

8

strptime lợi nhuận lớp POSIXlt mà thực sự là một danh sách mà giải thích lý do tại sao sử dụng nó bên trong một trong hai data.table hoặc data.frame đối tượng tạo ra vấn đề:

> 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

đây là câu trả lời tốt hơn, điều này trả về các cột của lớp '" POSIXct "' trong khi tôi trả về các cột ký tự – Jaap

4

Bạn cũng có thể sử dụng as.IDateas.ITime thay vì strptime. Hơn nữa, lapply là tốt hơn:

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] 

này cung cấp cho:

> 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

cảm ơn vì đã mang những chức năng này đến sự chú ý của tôi – Kerry

+0

Chúc mừng bạn đã đạt tới 10k! – akrun

Các vấn đề liên quan