Какая функция R отправляет вывод в новый вектор? - PullRequest
1 голос
/ 16 декабря 2010

Предположим, у меня есть data.frame с именем TLT, последняя строка которого выглядит так:

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

И я хочу добавить дополнительный вектор с именем TLT.BarColor, чтобы он выглядел так:

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

Вот функция, которая «печатает», был ли это день с зеленой или красной полосой.

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

Вместо использования функции print () R (которая печатает только на консоли), что RВы бы использовали функцию для отправки вывода для заполнения нового вектора?

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

Функция выборки не работает в этом решении.Но если бы функция была действительной, ее вывод можно было бы присоединить таким образом.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

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"  

Если вам нужны метки для одного тикера, но разных дат, то это то, что вы ищете:

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

Проблема, с которой вы, скорее всего, столкнулись, заключается в том, что getSymbols возвращает вам не фрейм данных, а объект xts. Для xts существуют специальные методы доступа и добавления данных, и не следует ожидать, что это будет вести себя как фрейм данных.

> X <- getSymbols("F",auto.assign=FALSE)
> class(X)
[1] "xts" "zoo"
0 голосов
/ 16 декабря 2010

Если вы изменили операторы печати просто на сам символьный вектор, например, «Красная полоса», вы можете добавить это к существующему вектору, например к последней строке. Это может быть более понятный код, если вы замените return () на print (). Единственная проблема заключается в том, что вектор должен быть в одном и том же режиме, поэтому вам нужно будет принять символьный вектор или использовать data.frame из одной строки.

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

onerowdf <- cbind( TLT[NROW(TLT), ], bar.color( "TLT")) ) 
# a data.frame (aka list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...