ddpy()
可以很好地处理这种大小 (10^2) 的数据集。但是,对于较大的数据集以及您不一定需要返回完整数据框的情况,我会考虑以下do.call
+lapply
解决方案:
my.fun <- function(cur.tic){
as.numeric(diff(temp$dcvt[temp$tic == cur.tic]) > 0)
}
do.call("c", lapply(unique(temp$tic), my.fun))
为了展示性能回报(考虑到向量与数据帧的问题,不公平),我获取了 OP 的样本数据,创建了大小为 10^4、10^5 和 10^6 的新数据帧,然后运行system.time()
@kohske 的ddply
解决方案并上面的解决方案:
原始数据(10^2):
> system.time(do.call("c", lapply(unique(temp$tic), my.fun)))
user system elapsed
0.000 0.000 0.003
> system.time(ddply(temp, .(tic), transform, dcvt=c(0, diff(dcvt)>0)))
user system elapsed
0.020 0.000 0.013
10^4 样本数据
> system.time(do.call("c", lapply(unique(temp.2$tic), my.fun)))
user system elapsed
0.000 0.000 0.002
> system.time(ddply(temp.2, .(tic), transform, dcvt=c(0, diff(dcvt)>0)))
user system elapsed
0.040 0.000 0.036
10^5 样本数据
> system.time(do.call("c", lapply(unique(temp.3$tic), my.fun)))
user system elapsed
0.000 0.000 0.004
> system.time(ddply(temp.3, .(tic), transform, dcvt=c(0, diff(dcvt)>0)))
user system elapsed
0.270 0.000 0.279
10^6 个样本数据
> system.time(do.call("c", lapply(unique(temp.4$tic), my.fun)))
user system elapsed
0.010 0.000 0.018
> system.time(ddply(temp.4, .(tic), transform, dcvt=c(0, diff(dcvt)>0)))
user system elapsed
6.110 0.070 6.186
不是抱怨ddply()
- 而是努力分享一些我最近在处理一个非常相似的问题时发现有用的代码,其中包含一个非常大的数据集。