2010-12-15 12 views
1

Angenommen, ich habe ein data.frame TLT deren Namen letzte Zeile ist dies:Welche R-Funktion sendet Ausgabe an einen neuen Vektor?

  TLT.Open TLT.Close 
2010-12-14  92.4  92.14 

Und ich möchte, genannt TLT.BarColor einen zusätzlichen Vektor hinzuzufügen, so dass es wie folgt aussieht:

  TLT.Open TLT.Close TLT.BarColor 
2010-12-14  92.4  92.14  "Green" 

Hier ist eine Funktion, die "druckt", ob es ein grüner oder roter Bar-Tag war.

bar_color <- function(ticker) { 

require("quantmod") 

x <- getSymbols(ticker, auto.assign=FALSE) 

open  <- x[,1]      
close  <- x[,2]      

last_open <- tail(open, n=1)    
last_close <- tail(close, n=1)    



if  (last_open > last_close)  
      {print("Red Bar")} 

else if (last_open < last_close)   
      {print("Green Bar")} 

else  {print("Doji Bar")}  

Statt den Druck der Verwendung von() R-Funktion (die nur Abzüge zu trösten), was R-Funktion würden Sie einen neuen Vektor zu füllen, um die Ausgabe zu senden?

super_dataframe <- cbind(TLT, apply(TLT, 1, valid_function)) 

Die Beispielfunktion funktioniert in dieser Lösung nicht. Aber wenn die Funktion gültig wäre, könnte ihre Ausgabe auf diese Weise angehängt werden.

+0

Was ist das Endziel hier? Versuchst du etwas zu planen? Warum müssen Sie einen neuen Vektor füllen? – Chase

+0

siehe '? Return()' –

+0

@Chase Ich versuchte, mein Endziel zu verallgemeinern, um die Frage zu vereinfachen, aber ich baue ein Handelsmodell, wo der Preis vier Regionen belegen kann, zwei eindeutig und die anderen zweideutig. Die zwei mehrdeutigen Regionen werden basierend auf dem, was das Modell gestern signalisierte, aufgelöst. Wenn 1, dann ist pos = lang. Wenn 4, dann ist pos = kurz. Wenn 2 || 3, dann pos = pos [-1]. Ersetzen Sie die Strichfarbe im Beispiel durch einen Pos (Position) -Vektor, der basierend auf einem Algorithmus, der komplexer als der Barcolor-Algorithmus ist, gefüllt wird. – Milktrader

Antwort

2

ticker kann kein Datenrahmen, sondern hat ein Charakter sein. Mit der Anwendung, die Sie verwenden, um Ihren Super-Datenrahmen zu erstellen, haben Sie ein Problem. Die folgende Funktion gibt die Bezeichnungen für verschiedene Ticker an.

bar_color <- function(ticker){ 
    x <- getSymbols(ticker,auto.assign=FALSE) 
    n <- nrow(x) 
    switch(
     sign(x[n,1]-x[n,4])+2, 
     "Green Bar", 
     "Doji Bar", 
     "Red Bar") 
} 

> TLT <- c("F","QQQQ") 
> cbind(TLT,sapply(TLT,bar_color)) 
    TLT    
F "F" "Green Bar" 
QQQQ "QQQQ" "Red Bar" 

Wenn Sie die Etiketten für einen Ticker, aber unterschiedlichen Terminen wollen, dann ist es das, was Sie suchen:

bar_color <- function(ticker){ 
    x <- as.data.frame(getSymbols(ticker,auto.assign=FALSE)) 

    x$barcolor <- sapply(
      as.numeric(sign(x[,1]-x[,4])+2), 
      function(j) switch(j,"Green Bar","Doji Bar","Red Bar") 
    ) 

    return(x) 
} 

> head(bar_color("F")) 
      F.Open F.High F.Low F.Close F.Volume F.Adjusted barcolor 
2007-01-03 7.56 7.67 7.44 7.51 78652200  7.51 Red Bar 
2007-01-04 7.56 7.72 7.43 7.70 63454900  7.70 Green Bar 
2007-01-05 7.72 7.75 7.57 7.62 40562100  7.62 Red Bar 
2007-01-08 7.63 7.75 7.62 7.73 48938500  7.73 Green Bar 
2007-01-09 7.75 7.86 7.73 7.79 56732200  7.79 Green Bar 
2007-01-10 7.79 7.79 7.67 7.73 42397100  7.73 Red Bar 

Das Problem, das Sie -likely- Gesicht ist die Tatsache, dass getSymbols nicht gib dir einen Datenrahmen zurück, aber ein xts-Objekt. Für xts gibt es bestimmte Methoden, um auf Daten zuzugreifen und sie hinzuzufügen, und man sollte nicht erwarten, dass sich dies wie ein Datenrahmen verhält.

> X <- getSymbols("F",auto.assign=FALSE) 
> class(X) 
[1] "xts" "zoo" 
+0

Die zweite Funktion macht genau das, was ich erreichen wollte. Ich ersetzte meine if - else if - else Struktur durch die vektorisierte Version von ifelse (, , )), aber Ihre Lösung nimmt einen anderen Weg. Du hast mich mit einigen neuen Konzepten vertraut gemacht und ich kann nicht behaupten, dass ich es noch vollständig verstanden habe, aber mit etwas Graben werde ich es tun. Danke für die Antwort! – Milktrader

+0

@Miltrader: Schau dir an und schalte ein. Was ich hier tue, ist, x y durch die Werte 1,2 und 3 zu ersetzen. Wenn also x

+0

@Milktrader: nur aus Neugier, aus welcher Programmiersprache kommst du? –

0

Wenn Sie die Druckanweisungen einfach in den Zeichenvektor selbst geändert haben, z. B. "Roter Balken", können Sie diesen zu einem vorhandenen Vektor wie der letzten Zeile hinzufügen. Es könnte klarer Code sein, wenn Sie return() für die print() ersetzen. Das einzige Problem besteht darin, dass ein Vektor im selben Modus sein muss, so dass Sie einen Zeichenvektor akzeptieren oder ein einzeiliges Datenframe verwenden müssen.

vec <- c(TLT[NROW(TLT), ] , bar.color("TLT")) # a character vector 

onerowdf <- cbind(TLT[NROW(TLT), ], bar.color("TLT"))) 
# a data.frame (aka list) 
+0

Okay, ich sehe, wie die Beseitigung der print() -Funktion hilft. Wäre es besser, -1, 1 oder Null zurückzugeben und dann eine Zeichenfolge auszudrucken, wenn sie von einer anderen Konvertierungsfunktion benötigt wird. Ich sehe Ihren Standpunkt über das Mischen von Datentypen in einem dat.frame. Ruby lässt Sie es tun, ich habe vergessen, R braucht eine Liste, um es zu tun. – Milktrader

+0

Das hängt davon ab, was Sie mit den Ergebnissen tun. Da es sich anhört, als ob Sie es als Zwischenprodukt verwenden würden, würde ich wahrscheinlich eine Liste verwenden. –

+0

@Miltrader: Komm schon! R lass dich das auch tun. Ein Datenrahmen ist nichts weiter als eine benannte Liste, in der jedes Element die gleiche Länge haben muss. Wenn die Länge des resultierenden Vektors nicht mit der der anderen Variablen übereinstimmt, funktioniert das natürlich nicht. Aber dann kann ich mir nicht vorstellen, wie Sie diese zusammen in einem Dataset hinzufügen möchten. –

Verwandte Themen