2017-05-18 2 views
1

Ich versuche den maximalen und den zweitgrößten Wert während eines 6-monatigen Intervalls zu finden. Ich benutze RunMax, um den ersten Wert zu finden, aber ich kann nicht herausfinden, wie man für den zweiten Wert vorgeht. Hier ist mein Code so weit:Den zweithöchsten Wert in quantmod nach Zeitraum finden

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 

Ich möchte eine andere Säule mit dem zweitgrößten Wert hinzufügen, so etwas zu haben:

 
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 

Jede Idee?

+0

hat eine unserer Antworten Ihr Problem lösen? – AidanGawronski

Antwort

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

Das löst mein Problem! – JKFY13

0

Hier ist eine Möglichkeit, es zu tun:

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

Das funktioniert mit Ihrem Datenrahmen, aber ich kann nicht mit realen Daten arbeiten (z. B. GOOGL). Kannst du mir helfen, das zu beheben? – JKFY13

+0

@ JKFY13 Wenn Sie Ihre Daten (z. B. 'dput') zur Verfügung stellen - vielleicht. Ich bekomme ein Gateway-Timeout bei der Verwendung von getSymbols ... – lukeA

+0

@ JKFY13 lieferte ein gebrochenes reproduzierbares Beispiel ... deshalb habe ich diesen Teil in meine Antwort unten eingefügt. – AidanGawronski