2017-04-02 96 views
0

R博客上有一篇博客文章如何将R中的股票价格转换为回报。它会将第一行转换为1,然后跟踪前进的回报。因此,他们有股票数据的这个例子:了解一行R代码

##   AAPL.Close MSFT.Close GOOG.Close 
## 2016-01-04  105.35  54.80  741.84 
## 2016-01-05  102.71  55.05  742.58 
## 2016-01-06  100.70  54.05  743.62 
## 2016-01-07  96.45  52.17  726.39 
## 2016-01-08  96.96  52.33  714.47 
## 2016-01-11  98.53  52.30  716.03 

当加载库magittr(这显然是一个“管道”运营商),并运行此行代码:

stock_return <- apply(stocks, 1, function(x) {x/stocks[1,]}) %>% t %>% as.xts 

你这个:

  AAPL.Close MSFT.Close GOOG.Close 
2016-01-04 1.0000000 1.0000000 1.0000000 
2016-01-05 0.9749407 1.0045620 1.0009975 
2016-01-06 0.9558614 0.9863139 1.0023994 
2016-01-07 0.9155197 0.9520073 0.9791734 
2016-01-08 0.9203607 0.9549271 0.9631052 
2016-01-11 0.9352634 0.9543796 0.9652081 

我不明白这行代码如何工作。我知道apply函数将在每一行操作(参数1完成该操作)。我知道在理论上我想自己划分第一行(这将给出该行1),然后将第一行除以第一行,这将显示投资如何随时间变化。

所以这部分代码的功能是:

{x/stocks[1,]}) %>% t %>% 

它是与“管道运营商”和业务工作的左到右,而不是里面出来。有人能帮助我理解这个函数的语法,以及它如何完成它应该做的事情?我可以使用它,但我宁愿不要让它成为黑盒子。谢谢!

回答

0

首先要注意的是,如果输入是矩阵,此代码才有效。 要使它重现的读取数据如下:

library(magrittr) 
library(xts) 
df <- read.table(text =" ,AAPL.Close, MSFT.Close, GOOG.Close 
      2016-01-04,  105.35,  54.80,  741.84 
      2016-01-05,  102.71,  55.05,  742.58 
      2016-01-06,  100.70,  54.05,  743.62 
      2016-01-07,  96.45,  52.17,  726.39 
      2016-01-08,  96.96,  52.33,  714.47 
      2016-01-11,  98.53,  52.30,  716.03", 
      sep = ",", header = TRUE, row.names = 1) 
stock <- as.matrix(df) 

如果你努力去理解整个管是如何工作的一次只是把它拆分成其组件。

第一部分是apply函数。

apply(df, 1, function(x) {x/df[1,]}) 

当你正确地说,它的工作原理上的矩阵意味着
它采用martix的每一行的行和seperatly通过他们所提供的功能(实际上有一个for循环在后台运行)。一个简单的例子是mean

apply(stock, 1, mean) 

这将简单地计算每行的平均值。博客的作者做了一些稍微复杂的工作,并提供了匿名函数(为这项特殊任务编写的函数)function(x) {x/stock[1,]}

因此,顺序的每一行都作为第一个参数传递给提供的函数。该函数只有一个参数x。所以你可以把x想象成一个代表原始矩阵的一行的向量。要弄清楚这个功能在做什么,请看它的主体x/stock[1,]

x表示原始矩阵的一行,并且stock[1, ]是原始矩阵的第一行。因此,矩阵的每一行是一个接一个由所述矩阵的第一行devided并且结果被添加作为列到一个新的矩阵,其看起来像这样

     2016-01-04    2016-01-05    2016-01-06 
AAPL.Close      1    0.9749407    0.9558614 
MSFT.Close      1    1.0045620    0.9863139 
GOOG.Close      1    1.0009975    1.0023994 
         2016-01-07    2016-01-08    2016-01-11 
AAPL.Close    0.9155197    0.9203607    0.9352634 
MSFT.Close    0.9520073    0.9549270    0.9543796 
GOOG.Close    0.9791734    0.9631053    0.9652081 

相比于最终输出此行和列是换位。 如果您使用t(管道中的第二个函数)传输此矩阵,您将得到所需的输出矩阵。最后一个函数as.xts只是将矩阵转换为特殊类型的时间序列对象,即xts对象。

+0

我真的很感谢你的帮助,回答了@alex,并道歉,这不是发布此问题的正确地方。我不确定如何关闭此功能,因为这是我第一次发布,但在下次发布时我会更加谨慎。谢谢! –