Cosa R funzione invia l'output a un nuovo vettore?
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.
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)