Question

Supposons que j'ai un data.frame TLT nommé dont la dernière ligne est la suivante:

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

Et je veux ajouter un vecteur supplémentaire appelé TLT.BarColor il ressemble à ceci:

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

Voici une fonction qui « imprime » si elle était un jour de barre verte ou rouge.

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

Au lieu d'utiliser l'impression () fonction R (qui imprime uniquement à la console), quelle fonction R-vous utiliser pour envoyer la sortie pour alimenter un nouveau vecteur?

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

La fonction exemple ne fonctionne pas dans cette solution. Mais si la fonction était valide, sa sortie pourrait être fixé de cette manière.

Était-ce utile?

La solution

ticker ne peut pas être un dataframe, mais doit être un caractère. Donc, avec l'appliquer que vous utilisez pour créer votre bloc de données super, vous aurez un problème. La fonction suivante donne les étiquettes pour différents tickers.

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"  

Si vous voulez que les étiquettes pour un symbole, mais des dates différentes, alors c'est ce que vous cherchez:

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

Le problème que vous -likely- visage est le fait que getSymbols ne vous renvoie pas une trame de données, mais un objet XTS. Pour XTS il existe des méthodes spécifiques d'accès et d'ajouter des données, et il ne faut pas attendre à ce que de se comporter comme une trame de données.

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

Autres conseils

Si vous avez modifié les instructions d'impression simplement le vecteur de caractère lui-même, par exemple « Red Bar », vous pouvez l'ajouter à un vecteur existant tel que la dernière ligne. Il pourrait être code plus clair si vous substitué retour () pour l'impression () 's. Le seul problème est que les besoins de vecteur à tout le même mode que vous devez accepter un vecteur de caractères ou d'utiliser un data.frame une ligne.

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

onerowdf <- cbind( TLT[NROW(TLT), ], bar.color( "TLT")) ) 
# a data.frame (aka list)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top