0
我有一個xts
對象,其中包含多個股票代碼的時間序列。我需要在符號特定的子組中分割xts
對象,並處理每個符號的數據,然後重新組裝包含完整行集合的原始xts
矩陣中的所有子組。每個符號都是1到4個字符之間的字段,它被用作分解子組中矩陣的因子索引。爲什麼R()和lapply()之間的性能差異如此之大?
這些報道調用by()
,lapply()
和ddply()
當分裂我的矩陣時間:
> dim(ets)
[1] 442750 24
> head(ets)
Symbol DaySec ExchTm LclTm Open High Low Close CloseRet
2011-07-22 09:35:00 "AA" "34500" "09:34:54.697.094" "09:34:54.697.052" " 158100" " 158400" " 157900" " 158200" " 6.325111e-04"
2011-07-22 09:35:00 "AAPL" "34500" "09:34:59.681.827" "09:34:59.681.797" "3899200" "3899200" "3892200" "3894400" "-1.231022e-03"
2011-07-22 09:35:00 "ABC" "34500" "09:34:49.805.994" "09:34:49.806.008" " 400100" " 401800" " 400100" " 401600" " 3.749063e-03"
2011-07-22 09:35:00 "ALL" "34500" "09:34:59.009.001" "09:34:59.008.810" " 285500" " 285500" " 285300" " 285300" "-7.005254e-04"
2011-07-22 09:35:00 "AMAT" "34500" "09:34:59.982.447" "09:34:59.982.423" " 130200" " 130500" " 130200" " 130500" " 2.304147e-03"
2011-07-22 09:35:00 "AMZN" "34500" "09:34:48.012.576" "09:34:48.012.565" "2137400" "2139100" "2137400" "2139100" " 7.953588e-04"
... (15 more columns)
> system.time(by(ets, ets$Symbol, function(x) { return(x) }))
user system elapsed
78.725 0.932 79.735
> system.time(ddply(as.data.frame(ets), "Symbol", function(x) { return (x) }))
user system elapsed
100.590 0.416 101.105
> system.time(lapply(split.default(ets, ets$Symbol), function(x) { return(x) }))
user system elapsed
1.572 0.280 1.853
與數據幀和矩陣子組的詳細信息都在this優秀的博客文章可用。
爲什麼在使用lapply/split.default時性能會有如此大的差異?
請提供myxts'的'一個小樣本。我不使用'by',並且可能有一種方法可以使用標準xts工具來執行所需的操作,但是如果沒有可重複的示例,很難知道。 – 2012-01-17 20:21:41
是的,'head(myxts)'會太大。 'myxts [X:Y,1:5]'如何在'X:Y'行中包含'Symbol'的多個值......'summary'如何告訴你任何對角色有用的東西? – 2012-01-17 21:07:54
我不認爲我理解你想要做什麼,但嘗試調用像lapply(split.default(myxts,myxts $ Symbol),str)''。 – 2012-01-17 21:27:48