2012-01-17 82 views
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時性能會有如此大的差異?

+0

請提供myxts'的'一個小樣本。我不使用'by',並且可能有一種方法可以使用標準xts工具來執行所需的操作,但是如果沒有可重複的示例,很難知道。 – 2012-01-17 20:21:41

+0

是的,'head(myxts)'會太大。 'myxts [X:Y,1:5]'如何在'X:Y'行中包含'Symbol'的多個值......'summary'如何告訴你任何對角色有用的東西? – 2012-01-17 21:07:54

+0

我不認爲我理解你想要做什麼,但嘗試調用像lapply(split.default(myxts,myxts $ Symbol),str)''。 – 2012-01-17 21:27:48

回答

0

在數字模式下工作大大減少處理時間:

> system.time(by(myxts[,c(1,2,3,4,5)], myxts$Symbol, summary)) 
    user system elapsed 
57.768 0.688 58.511 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8)], myxts$Symbol, summary)) 
    user system elapsed 
    62.284 0.620 62.971 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
76.529 0.632 77.232 
> myxts.numeric = myxts 
> mode(myxts.numeric) = "numeric" 
Warning message: 
In as.double.xts(c("AA", "AAPL", "ABC", "ALL", "AMAT", "AMZN", "BAC", : 
    NAs introduced by coercion 
> system.time(by(myxts.numeric[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
    4.948 0.688 5.642 
相關問題