【问题标题】:using apply function with data.table, why this is so slow?将apply函数与data.table一起使用,为什么这么慢?
【发布时间】:2013-09-01 01:39:52
【问题描述】:

我正在使用data.table 包,我使用了这个:

dt$date<- as.POSIXct(dt$date, tz="GMT")      (I know I can use fastPOSIXct)
2009-08-07 06:00:14
2009-08-07 06:00:15
2009-08-07 06:00:16 
2009-08-07 06:00:24

我想更改时区(有很多)并提取小时。假设我想使用 apply 函数:

f <- function(x) {
  SydneyTime<-format(x["date"], format = "%Y-%m-%d %H:%M:%OS", tz = "Australia/Sydney")
  Sy<-hour(SydneyTime)
  return(Sy)
}

mydata$SyHour <- apply(dt, 1, f)

这太慢了,我错过了什么吗?我不想保留 SydneyTime 的副本。

谢谢。

【问题讨论】:

  • apply 将 data.table 强制转换为矩阵,然后您就失去了所有 data.table 的魔力。

标签: r data.table apply


【解决方案1】:

你不需要复制任何东西。 format.Date 是矢量化的,因此您可以使用 := 使用原始列中的数据在您的 data.table 中创建一个新列。这是一个可重现的小例子:

require( data.table )
#  Seconds in the day
n <- 86400

#  Make some data
DT <- data.table( Date = as.POSIXct( Sys.time()+seq(0,2*n,by=n) , tz = "GMT") )
#                  Date
#1: 2013-08-28 21:17:10
#2: 2013-08-29 21:17:10
#3: 2013-08-30 21:17:10

#  Change the TZ
DT[ , Date2:=format( Date , tz = "Australia/Sydney")]
#                  Date               Date2
#1: 2013-08-28 21:17:10 2013-08-29 06:17:10
#2: 2013-08-29 21:17:10 2013-08-30 06:17:10
#3: 2013-08-30 21:17:10 2013-08-31 06:17:10

编辑下面的评论

lapply 设计为与data.table 一起按列使用。要就地修改Date 列,您可以这样做:

DT[ , lapply( .SD , format , tz = "Australia/Sydney" ) ]

但在将其用于真实数据之前,请检查 .SD.SDcols 的含义。

【讨论】:

  • 1.我假设 SydneyTime
  • 1.是的。 := 是一个 data.table 函数。通过键入?data.table::`:=` 阅读它。 2. 我不明白你为什么想要data.table 上使用apply 而不是为它设计的?
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 2011-04-15
  • 2022-12-04
  • 2014-11-23
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多