2010-12-15 59 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