2017-05-18 30 views
1

我試圖在6個月的時間間隔內找到最大值和第二大值。我正在使用runMax來查找第一個值,但我無法弄清楚如何爲第二個值做些什麼。這裏是我到目前爲止的代碼:按時間段查找quantmod中第二高的值

library(quantmod) 
    library(TTR) 
    getSymbols("GOOGL") 
    GOOGL_mo<-to.monthly(GOOGL)#to get monthly data 
    GOOGL_mo$Max_6mo<-runMax(GOOGL.High, 6)#add a column with the max value during a 6 months period 

我想與第二大值添加另一列有這樣的事情:

 
Date  Open  High  Low  Close  Volume Max6mo 2ndMax6m0 
Oct 2016 802.55 839.00 796.23  809.90 35391730 839.00 819.06 
Nov 2016 810.87 816.04 743.59  775.88 48353316 839.00 819.06 
Dec 2016 778.55 824.30 753.36  792.45 34356689 839.00 824.00 
Jan 2017 800.62 867.00 796.89  820.19 36840255 867.00 839.00 
Feb 2017 824.00 853.79 812.05  844.93 26492197 867.00 853.79 
Mar 2017 851.38 874.42 824.30  847.80 34553208 874.42 867.00 
Apr 2017 848.75 935.90 834.60  924.52 28721553 935.90 874.42 
May 2017 924.15 965.90 920.80  942.17 21302485 965.90 935.90 

任何想法?

+0

哪裏我們一個答案解決問題了嗎? – AidanGawronski

回答

0
library(quantmod) 
library(TTR) 
getSymbols("GOOG",src="google") 
GOOG <- to.monthly(GOOG) 

thing <- data.frame(max1 = rep(NA, 5), max2 = rep(NA, 5)) 
for (x in 1:(nrow(GOOG)-5)) { 
    max1 <- max(GOOG[x:(x+5), "GOOG.High"]) 
    max2 <- max(GOOG$GOOG.High[x:(x+5)][GOOG$GOOG.High[x:(x+5)] != max1]) 
    thing <- rbind(thing, data.frame(max1, max2)) 
} 
GOOG <- cbind(data.frame(GOOG), thing) 
+0

這解決了我的問題! – JKFY13

0

下面是做這件事:

df <- read.table(header=T, text=" 
      Open  High  Low  Close  Volume Max6mo 2ndMax6m0 
Aug2016 786.67 813.88 785.04  789.85 28857075 813.88 803.94 
Sep2016 791.98 819.06 783.50  804.06 31574466 819.06 813.88 
Oct2016 802.55 839.00 796.23  809.90 35391730 839.00 819.06 
Nov2016 810.87 816.04 743.59  775.88 48353316 839.00 819.06 
Dec2016 778.55 824.30 753.36  792.45 34356689 839.00 824.00 
Jan2017 800.62 867.00 796.89  820.19 36840255 867.00 839.00 
Feb2017 824.00 853.79 812.05  844.93 26492197 867.00 853.79 
Mar2017 851.38 874.42 824.30  847.80 34553208 874.42 867.00 
Apr2017 848.75 935.90 834.60  924.52 28721553 935.90 874.42 
May2017 924.15 965.90 920.80  942.17 21302485 965.90 935.90") 
cbind(
    df, 
    rollapplyr(df$High, 6, function(x) 
      setNames(sort(x, decreasing = T)[1:2], c("a","b")), fill = NA) 
) 
#   Open High Low Close Volume Max6mo X2ndMax6m0  a  b 
# Aug2016 786.67 813.88 785.04 789.85 28857075 813.88  803.94  NA  NA 
# Sep2016 791.98 819.06 783.50 804.06 31574466 819.06  813.88  NA  NA 
# Oct2016 802.55 839.00 796.23 809.90 35391730 839.00  819.06  NA  NA 
# Nov2016 810.87 816.04 743.59 775.88 48353316 839.00  819.06  NA  NA 
# Dec2016 778.55 824.30 753.36 792.45 34356689 839.00  824.00  NA  NA 
# Jan2017 800.62 867.00 796.89 820.19 36840255 867.00  839.00 867.00 839.00 
# Feb2017 824.00 853.79 812.05 844.93 26492197 867.00  853.79 867.00 853.79 
# Mar2017 851.38 874.42 824.30 847.80 34553208 874.42  867.00 874.42 867.00 
# Apr2017 848.75 935.90 834.60 924.52 28721553 935.90  874.42 935.90 874.42 
+0

這與您的數據框一起工作,但我無法使其與真實數據一起工作(例如GOOGL)。你能幫我解決這個問題嗎? – JKFY13

+0

@ JKFY13如果你提供你的數據(例如'dput') - 也許。當使用getSymbols時,我得到一個網關超時... – lukeA

+0

@ JKFY13提供了一個可重複使用的例子...這就是爲什麼我在下面的答案中包含這個部分。 – AidanGawronski