将 strptime 函数应用于 data.table 的每个成员
Apply strptime function to every member of a data.table
我无法将函数应用于 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")
returns "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]
您也可以使用 as.IDate
和 as.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
strptime
returns class 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
我无法将函数应用于 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")
returns "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]
您也可以使用 as.IDate
和 as.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
strptime
returns class 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