2010-12-15 4 views
1

Supposons que j'ai un data.frame nommé TLT dont la dernière ligne est la suivante:Quelle fonction R envoie la sortie à un nouveau vecteur?

  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" 

ici est une fonction qui "imprime" s'il s'agit d'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 attachée de cette manière.

+0

Quel est l'objectif final ici? Es-tu en train d'essayer de tracer quelque chose? Pourquoi avez-vous besoin de peupler un nouveau vecteur? – Chase

+0

voir '? Return()' –

+0

@Chase J'essayais de généraliser mon objectif final pour simplifier la question, mais je construis un modèle de trading où le prix peut occuper quatre régions, deux sans ambiguïté et les deux autres ambiguës. Les deux régions ambiguës sont résolues en fonction de ce que le modèle indiquait hier. Si 1, alors pos = long. Si 4, alors pos = court. Si 2 || 3, puis pos = pos [-1]. Remplacez la barre de couleur dans l'exemple par le vecteur pos (position) qui est basé sur un algorithme plus complexe que l'algo barcolor. – Milktrader

Répondre

2

ticker ne peut pas être un dataframe, mais doit être un caractère. Donc, avec l'application que vous utilisez pour créer votre super cadre de données, 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- face est le fait que getSymbols ne pas vous renvoyer une image, mais un objet xts. Pour xts, il existe des méthodes spécifiques pour accéder et ajouter des données, et il ne faut pas s'attendre à ce que cela se comporte comme une trame de données.

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

La deuxième fonction fait exactement ce que j'essayais d'accomplir. J'ai remplacé ma structure if - else if - else par la version vectorisée de ifelse (, , ), mais votre solution prend une autre direction. Vous m'avez présenté de nouveaux concepts et je ne peux pas prétendre que je l'ai encore bien compris, mais je vais le faire en creusant un peu. Merci d'avoir répondu! – Milktrader

+0

@Milktrader: regardez? Signe et? Commutateur. Ce que je fais ici, c'est remplacer x y par les valeurs 1,2 et 3. Donc quand x

+0

@Milktrader: juste par curiosité, à partir de quel langage de programmation venez-vous? –

0

Si vous avez modifié les instructions d'impression simplement pour le vecteur de caractères lui-même, par exemple "Barre rouge", vous pouvez l'ajouter à un vecteur existant tel que la dernière ligne. Il pourrait être plus clair si vous substituiez return() pour print(). Le seul problème est qu'un vecteur doit être de tout le même mode, donc vous devrez accepter un vecteur de caractères ou utiliser une ligne de données.

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

bien, je vois comment l'élimination de la fonction print() aide. Serait-il préférable de retourner -1, 1 ou zéro, puis imprimer une chaîne si nécessaire par une fonction de conversion différente. Je vois votre point sur le mélange des types de données dans un data.frame. Ruby vous laisse faire, j'ai oublié R a besoin d'une liste pour le faire. – Milktrader

+0

Cela dépend de ce que vous faites avec les résultats. Comme il semble que vous allez l'utiliser comme intermédiaire, j'utiliserais probablement une liste. –

+0

@Milktrader: Allez! R vous laisse faire ça aussi. Une trame de données n'est rien de plus qu'une liste nommée où chaque élément doit avoir la même longueur. Bien sûr, si la longueur du vecteur résultant n'est pas la même que celle de vos autres variables, cela ne fonctionne pas. Mais je ne peux pas imaginer comment vous voudrez peut-être les ajouter dans un datasset. –

Questions connexes