2010-12-15 64 views
1

假設我有一個名爲TLT其最後一行data.frame是這樣的:什麼R函數發送輸出到一個新的矢量?

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

除了使用打印()R功能(控制檯,它只能打印),你會用什麼一個R函數來發送輸出到填充新的載體?

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

示例函數在此解決方案中不起作用。但是如果該功能是有效的,它的輸出可以以這種方式附加。

+0

這裏的最終目標是什麼?你想要繪製一些東西嗎?爲什麼你需要填充一個新的矢量? – Chase 2010-12-16 03:24:49

+0

參見'?return()' – 2010-12-16 09:36:21

+0

@Chase我試圖推廣我的最終目標來簡化問題,但我正在建立一個交易模型,其中價格可以佔據四個區域,兩個明確而另外兩個模糊不清。這兩個不明確的區域是根據模型昨天發出的信號來解決的。如果1,那麼pos = long。如果4,那麼pos =短。如果2 || 3,則pos = pos [-1]。使用pos(位置)向量代替示例中的barcolor,該向量基於比barcolor算法更復雜的算法填充。 – Milktrader 2010-12-16 16:15:27

回答

2

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 

的問題,你-likely-面對的就是getSymbols沒有事實返回一個數據框,但是一個xts對象。對於xts,有特定的方法來訪問和添加數據,並且不應該期望它像數據框一樣工作。

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

第二個功能正是我想要完成的。我用ifelse的矢量化版本取代了if-else if-else結構(,,)),但您的解決方案採用了不同的方式。你已經向我介紹了一些新的概念,但我不能說我已經完全掌握了它,但是隨着一些挖掘,我會。感謝你的回答! – Milktrader 2010-12-16 16:28:49

+0

@Milktrader:看看?sign和?開關。我在這裏做的是用值1,2和3替換x y。所以當x 2010-12-16 16:39:14

+0

@Milktrader:出於好奇,你會從哪種編程語言中走出來? – 2010-12-16 16:41:00

0

如果您將打印語句簡單地更改爲字符矢量本身,例如「紅色欄」,則可以將其添加到現有矢量,如最後一行。如果您將print()的值替換爲return(),它可能會更清晰。唯一的問題是矢量需要全部是相同的模式,所以你需要接受一個字符矢量或者使用一行數據幀。

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

好吧,我看到如何消除print()函數的幫助。返回-1,1還是0會更好,然後在需要時通過不同的轉換函數打印出字符串。我看到你在數據框架中混合數據類型的觀點。 Ruby讓你做到了,我忘了R需要一個列表來做到這一點。 – Milktrader 2010-12-15 23:19:37

+0

這取決於你對結果所做的事情。既然聽起來好像你將要用它作爲中間件,那麼我可能會使用一個列表。 – 2010-12-16 03:26:41

+0

@Milktrader:加油! R讓你做到這一點。數據框只不過是一個命名列表,其中每個元素必須具有相同的長度。當然,如果結果向量的長度與其他變量的長度不相同,則不起作用。但是,我無法想象你可能想如何將它們加在一個數據集中。 – 2010-12-16 09:46:50