【问题标题】:What R function sends output to a new vector?什么 R 函数将输出发送到新向量?
【发布时间】:2011-05-26 05:38:45
【问题描述】:

假设我有一个名为 TLT 的 data.frame,它的最后一行是:

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

示例函数在此解决方案中不起作用。但是如果函数是有效的,它的输出可以以这种方式附加。

【问题讨论】:

  • 这里的最终目标是什么?你想图谋什么吗?为什么需要填充新向量?
  • @Chase 我试图概括我的最终目标以简化问题,但我正在建立一个交易模型,其中价格可以占据四个区域,两个明确,另外两个不明确。这两个模棱两可的区域是根据模型昨天发出的信号来解决的。如果为 1,则 pos = long。如果为 4,则 pos = 短。如果 2 || 3,则 pos = pos[-1]。将示例中的 barcolor 替换为基于比 barcolor 算法更复杂的算法填充的 pos(位置)向量。

标签: r xts


【解决方案1】:

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"

【讨论】:

  • 第二个函数正是我想要完成的。我用 ifelse(, , )) 的矢量化版本替换了我的 if - else if - else 结构,但是您的解决方案采用了不同的方式。你向我介绍了一些新概念,我还不能说我完全掌握了它,但通过一些挖掘我会的。感谢您的回答!
  • @Milktrader:看看 ?sign 和 ?switch。我在这里所做的是将 xy 替换为值 1,2 和 3。所以当 x
  • @Milktrader:只是出于好奇,你是从哪种编程语言来的?
  • 我不是专业的程序员,也从未参加过编程课程,我的问题就证明了这一点。我感谢您的帮助。我的自学方法是熟悉 C、R 和 Ruby。我对每个方面的了解都非常少。
【解决方案2】:

如果您将打印语句更改为简单的字符向量本身,例如“Red Bar”,您可以将其添加到现有向量中,例如最后一行。如果您用 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)

【讨论】:

  • 好吧,我知道消除 print() 函数有什么帮助。返回 -1、1 或零会更好,然后在不同的转换函数需要时打印出一个字符串。我明白你关于在 data.frame 中混合数据类型的观点。 Ruby 让你做,我忘了 R 需要一个列表来做。
  • 这取决于您对结果的处理方式。由于听起来好像您将使用它作为中间体,所以我可能会使用一个列表。
  • @Milktrader:来吧! R 也让你这样做。数据框只不过是一个命名列表,其中每个元素必须具有相同的长度。当然,如果结果向量的长度与其他变量的长度不同,则它不起作用。但是我无法想象您可能希望如何将它们添加到数据集中。
  • @Milktrader 您可以在 data.frame 中混合类型,但看起来您正在使用 xts 对象。 xts 对象是具有时间索引的矩阵。您不能在矩阵中混合类型。
猜你喜欢
  • 2016-02-15
  • 2012-05-13
  • 1970-01-01
  • 2016-03-02
  • 2014-05-07
  • 2016-02-28
  • 2023-03-13
  • 1970-01-01
  • 2019-04-09
相关资源
最近更新 更多