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))
Чтобы продемонстрировать выигрыши в производительности (несправедливо учитывая проблему вектора и данных), я взял образцы данных ОП, создал новые кадры данных величин 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()
- скорее, просто попытка поделиться кодом, который я нашел полезным, работая над очень похожей проблемой с оченьНабор данных Larget недавно.