Domanda

Supponiamo che io sono un data.frame chiamato TLT la cui ultima riga è questo:

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

E voglio aggiungere un vettore in più chiamato TLT.BarColor in modo che appaia in questo modo:

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

Ecco una funzione che "stampa" se era un giorno barra verde o rosso.

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")}    

Invece di utilizzare la funzione di R di stampa () (che solo stampe a console), quale funzione R usereste per inviare l'uscita per popolare un nuovo vettore?

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

La funzione di esempio non funziona in questa soluzione. Ma se la funzione fosse valida, di uscita potrebbe essere attaccato in questo modo.

È stato utile?

Soluzione

ticker non può essere un dataframe, ma deve essere un personaggio. Quindi, con la applicano che si utilizza per creare il frame di dati super, avrete un problema. La seguente funzione fornisce le etichette per i diversi ticker.

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"  

Se si desidera che le etichette per un ticker ma date diverse, allora questo è quello che stai cercando:

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

Il problema che -likely- viso è il fatto che getSymbols non ti restituiscono un dataframe, ma un oggetto XTS. Per XTS ci sono metodi specifici per l'accesso e aggiungere dati e non bisogna aspettarsi questo si comporti come un frame di dati.

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

Altri suggerimenti

Se è stato modificato le istruzioni di stampa semplicemente il carattere vettore stesso, per esempio "Red Bar", si può aggiungere che a un vettore esistente, come l'ultima riga. Potrebbe essere codice più chiaro se si sostituisse ritorno () per la stampa () 's. L'unico problema è che un vettore deve essere di tutti la stessa modalità in modo che avrebbe bisogno di accettare un vettore personaggio o utilizzare un data.frame di una riga.

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

onerowdf <- cbind( TLT[NROW(TLT), ], bar.color( "TLT")) ) 
# a data.frame (aka list)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top