我有一个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,因此没有并行计算。
我做错了什么?
答案 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