2016-06-01 3 views
1

私はこのcodeを使用して、プロットで燭台を作成しています。しかし、それは非常に非効率的なループを含んでいます(10K観測をループするのに38秒)。また、rbind関数を使用しています。つまり、日付を数値に変換してからもう一度戻す必要があります。これは日付を考慮してまっすぐ進むとは思われません。ループをベクター操作に置き換えます

Imは、より効率的な機能を置換する試みループである:出力は、入力データから1日(日)と3 COLである第1の観察とベクトルで

for(i in 1:nrow(prices)){ 
x <- prices[i, ] 

# For high/low 
mat <- rbind(c(x[1], x[3]), 
      c(x[1], x[4]), 
      c(NA, NA)) 

plot.base <- rbind(plot.base, mat) 
} 

、第2の観察であります入力データから1番目と4番目の列、3番目の観測は2つのNAsです。 NAsは後でプロットするために重要です。

これを達成する最も効率的な方法は何ですか?

最小再現例:

library(quantmod) 

    prices <- getSymbols("MSFT", auto.assign = F) 

    # Convert to dataframe 
    prices <- data.frame(time = index(prices), 
         open = as.numeric(prices[,1]), 
         high = as.numeric(prices[,2]), 
         low = as.numeric(prices[,3]), 
         close = as.numeric(prices[,4]), 
         volume = as.numeric(prices[,5])) 

# Create line segments for high and low prices 
    plot.base <- data.frame() 

    for(i in 1:nrow(prices)){ 
x <- prices[i, ] 

# For high/low 
mat <- rbind(c(x[1], x[3]), 
      c(x[1], x[4]), 
      c(NA, NA)) 

plot.base <- rbind(plot.base, mat) 
} 

編集:

dput(head(prices)) 
structure(list(time = structure(c(13516, 13517, 13518, 13521, 
13522, 13523), class = "Date"), open = c(29.91, 29.700001, 29.629999, 
29.65, 30, 29.799999), high = c(30.25, 29.969999, 29.75, 30.1, 
30.18, 29.889999), low = c(29.4, 29.440001, 29.450001, 29.530001, 
29.73, 29.43), close = c(29.860001, 29.809999, 29.639999, 29.93, 
29.959999, 29.66), volume = c(76935100, 45774500, 44607200, 50220200, 
44636600, 55017400)), .Names = c("time", "open", "high", "low", 
"close", "volume"), row.names = c(NA, 6L), class = "data.frame") 
+1

コードがオブジェクトを拡大しています( 'plot.base')です。それはプログラミングでできる最速の操作についてです。代替案の開発とテストを容易にするために[最小再現可能な例](http://stackoverflow.com/a/5963610/1412059)を提供してください。 – Roland

+0

@Roland完全な例がリンクにあります。元の投稿には最小の例が含まれます –

+0

例は*あなたの質問本文にあるはずです*。 – Roland

答えて

4

Iは、ループ内のオブジェクトを成長チュートリアルの警戒であろう。それはプログラミングでできる最速の操作の1つです。 (それはあなたの本のために必要な正確に余裕を持っている棚を購入して、棚にあなたが新しい本を買うたびに交換するようなものだ。)

このような用途のサブセット:

res <- data.frame(date = rep(prices[, 1], each = 3), 
        y = c(t(prices[,c(3:4)])[c(1:2, NA),])) #transpose, subset, make to vector 
res[c(FALSE, FALSE, TRUE), 1] <- NA 
#   date  y 
#1 2007-01-03 30.25 
#2 2007-01-03 29.40 
#3  <NA> <NA> 
#4 2007-01-04 29.97 
#5 2007-01-04 29.44 
#6  <NA> <NA> 
#7 2007-01-05 29.75 
#8 2007-01-05 29.45 
#9  <NA> <NA> 
#10 2007-01-08 30.10 
#11 2007-01-08 29.53 
#12  <NA> <NA> 
#13 2007-01-09 30.18 
#14 2007-01-09 29.73 
#15  <NA> <NA> 
#16 2007-01-10 29.89 
#17 2007-01-10 29.43 
#18  <NA> <NA> 
+1

:元のループ30.54秒。この方法は0.013秒であった。 –

関連する問題