为什么mutate()按组继续?

时间:2014-07-12 16:53:17

标签: r aggregate data.table

我有一个2.5M x 13矩阵,我尝试通过ID变量聚合。起初我尝试使用ddply,但我的记忆爆炸了。之后我尝试使用data.table,它运行得更快:

data <- as.data.table(data)
key(data) <- "ID"

agg<-mydata[,mutate(.SD,
           start = min(Date))
           , by = ID]

现在没有内存问题,到目前为止,在具有4.0GB内存的Intel i5 2.50GHz上运行此操作需要超过4个小时。操作系统是windows 7,因此没有并行计算。

我做错了什么?

2 个答案:

答案 0 :(得分:7)

您不需要mutate,只需使用start := min(Date)。我认为应该加快速度。

agg <- mydata[, start := min(Date), by = ID]

答案 1 :(得分:3)

@konvas打败了我,但你应该能够验证:=更快:

##
library(data.table)
library(plyr)
library(microbenchmark)
##
t0 <- as.Date("2013-01-01")
Df <- data.frame(
  ID=sample(LETTERS,500000,replace=TRUE),
  Date=t0+sample((-100):100,500000,replace=TRUE),
  stringsAsFactors=FALSE)
Dt1 <- data.table(Df)
setkeyv(Dt1,cols="ID")
Dt2 <- copy(Dt1)
##
f1 <- function(){
  Agg <- Dt1[
    ,
    mutate(.SD,start = min(Date)),
    by = list(ID)]
}
f2 <- function(){
  Agg <- Dt2[
    ,
    "Start":=min(Date),
    by=list(ID)]
}
##
Res <- microbenchmark(
  f1(),f2()
)
##
Unit: milliseconds
expr      min       lq   median       uq      max neval
f1() 25.08676 27.30188 28.22867 31.60754 63.97749   100
f2() 10.48293 11.39930 13.25193 14.26284 47.80564   100