【问题标题】:Apply strptime function to every member of a data.table将 strptime 函数应用于 data.table 的每个成员
【发布时间】:2015-12-15 23:19:24
【问题描述】:

我无法将函数应用于 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]

【问题讨论】:

  • 您的问题不在于 data.table 语法,而在于选择要应用的函数。

标签: r datetime data.table apply


【解决方案1】:

您也可以使用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

【讨论】:

  • 恭喜达到10k!
【解决方案2】:

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

【讨论】:

  • 这是更好的答案,它返回 "POSIXct" 类的列,而我的返回字符列
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2019-05-18
  • 2015-06-19
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
相关资源
最近更新 更多