2015-09-18 10 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を:

> 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の列を返しますが、mineは文字列を返します – 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] 

これは与える:実際にdata.tableまたはdata.frameのいずれかのオブジェクトの内側にそれを使用して問題を作成する理由を説明したリストです

> 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

関連する問題