使用dplyr添加带有库存退货的新列的功能

时间:2015-09-17 11:37:52

标签: r dplyr quantmod

我只想创建一个简单的函数,将每日返回列添加到股票价格数据框中。

作为手动剥离,它看起来像这样:

AAL <- mutate(AAL, logreturn = Delt(AAL$Price, type = "log"))
rownames(AAL) <- AAL[, 1]
AAL <- AAL[, 2:4]
AAL[1, 3] <- 0

它以这种方式工作。但是,我想通过简单地输入

来创建一个完成上述功能的功能
head(AAL)
        Date  Price Volume
1 2013-06-28 7.5839  31308
2 2013-07-01 7.2093   1054
3 2013-07-02 7.3098    109
4 2013-07-03 7.0539   1275
5 2013-07-04 7.0448     22
6 2013-07-05 7.0357    110

add_returns(AAL)


head(AAL)
            Price Volume   Delt.1.log
2013-06-28 7.5839  31308  0.000000000
2013-07-01 7.2093   1054 -0.050655720
2013-07-02 7.3098    109  0.013844054
2013-07-03 7.0539   1275 -0.035635258
2013-07-04 7.0448     22 -0.001290899
2013-07-05 7.0357    110 -0.001292568

我尝试这样做,但它不起作用:

add_return <- function(symbol){

  symbol <- mutate(eval(parse(text = paste0(symbol, collapse = "")), 
                   logreturn =
 Delt(eval(parse(text = paste0(symbol, "$Price", collapse = ""))), 
                                        type = "log"))

rownames(symbol) <- eval(parse(text = paste0(symbol, "$Date", collapse = "")))

symbol <- eval(parse(text = paste0(symbol, "[2:4]", collapse = "")))

eval(parse(text = paste0(symbol, "[1, 3]", collapse = ""))) <- 0

}

1 个答案:

答案 0 :(得分:1)

如果你只想以编程方式传递数据集的名称,你可以很容易地做到这一点,例如像这样(几乎与你的&#34;手册&#34; skript完全一样) ):

add_return <- function(data) {
  data <- transform(data, logreturn = Delt(Price, type = "log"))
  rownames(data) <- data[, 1]
  data <- data[, 2:4]
  data[1, 3] <- 0
  return(data)
}

然后,您可以使用以下方法调用您的函数:

add_return(AAL)
#            Price Volume   Delt.1.log
#2013-06-28 7.5839  31308  0.000000000
#2013-07-01 7.2093   1054 -0.050655720
#2013-07-02 7.3098    109  0.013844054
#2013-07-03 7.0539   1275 -0.035635258
#2013-07-04 7.0448     22 -0.001290899
#2013-07-05 7.0357    110 -0.001292568

话虽如此,如果你希望你的函数能够以编程方式允许其他输入,例如要处理的列名或新列的名称等,那将是一个不同的故事。(在这种情况下,你&#39; d可能想看看dplyr的non-standard evaluation vignette。)但是根据你的问题判断并试图制定这个功能,这不是你想要做的。

如果要永久更改全局环境中的数据,执行此操作的标准R方式将是:

AAL <- add_return(AAL)

通常不建议从功能内部到全局环境的分配,所以我会坚持这种标准方式,在这种情况下看起来很容易。