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的樣本數據,創建^ 4,10^5和10^6級10的新的數據幀,然後跑去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()
- 相反,只是努力分享一些我發現最有用的代碼,同時處理一個非常類似的問題,最近有一個很大的數據集。
謝謝!菜鳥的錯誤;我甚至在幾個月前看到'ddply'裏面的'變換'! – 2011-02-26 00:34:08