【问题标题】:Construct a "simple" fixed rolling window构建一个“简单”的固定滚动窗口
【发布时间】:2018-11-11 17:43:53
【问题描述】:

是否可以构造一个“简单”的固定滚动窗口? 假设我有以下数据集:

         Apple Microsoft     Tesla    Amazon
 2010 0.8533719 0.8078440 0.2620114 0.1869552
 2011 0.7462573 0.5127501 0.5452448 0.1369686
 2012 0.7580671 0.5062639 0.7847919 0.8362821
 2013 0.3154078 0.6960258 0.7303597 0.6057027
 2014 0.4741735 0.3906580 0.4515726 0.1396147
 2015 0.4230036 0.4728911 0.1262413 0.7495193
 2016 0.2396552 0.5001825 0.6732861 0.8535837
 2017 0.2007575 0.8875209 0.5086837 0.2211072
#I want to be able to produce the following result
s.matrix <- x[1:4,] 
#For the next period, I want to drop the first period and add the next period: 
s.matrix <- x[2:5,] 
#For the rest of the dataset it should be:
 x[3:6,], x[4:7,], x[5:8,]
#That is, the width should always be equal to four. 

我知道 lapply 能够做类似的事情,但是我必须设置一个固定值,这样它只会将新变量添加到已经存在的矩阵中而不删除第一个观察结果......或者我错了吗?

【问题讨论】:

  • 这似乎是一个 XY 问题。而不是创建滚动子集,您应该使用rollapply function 直接在滚动窗口上应用您想要的任何功能。
  • 也就是说,对您提出的问题的简单回答是“使用循环”。 for(i in 1:(nrow(x) - 3)) {s.matrix = x[i:(i + 3), ]; ...}

标签: r fixed rolling-computation


【解决方案1】:

假设x是最后注中的data.frame,使用rollapply获取所需索引,apply生成对应的数据帧列表。

library(zoo)

apply(rollapply(1:nrow(x), 4, c), 1, function(ix) x[ix, ])

给予:

[[1]]
       Apple Microsoft   Tesla  Amazon
2010 0.85337   0.80784 0.26201 0.18696
2011 0.74626   0.51275 0.54524 0.13697
2012 0.75807   0.50626 0.78479 0.83628
2013 0.31541   0.69603 0.73036 0.60570

[[2]]
       Apple Microsoft   Tesla  Amazon
2011 0.74626   0.51275 0.54524 0.13697
2012 0.75807   0.50626 0.78479 0.83628
2013 0.31541   0.69603 0.73036 0.60570
2014 0.47417   0.39066 0.45157 0.13961

[[3]]
       Apple Microsoft   Tesla  Amazon
2012 0.75807   0.50626 0.78479 0.83628
2013 0.31541   0.69603 0.73036 0.60570
2014 0.47417   0.39066 0.45157 0.13961
2015 0.42300   0.47289 0.12624 0.74952

[[4]]
       Apple Microsoft   Tesla  Amazon
2013 0.31541   0.69603 0.73036 0.60570
2014 0.47417   0.39066 0.45157 0.13961
2015 0.42300   0.47289 0.12624 0.74952
2016 0.23966   0.50018 0.67329 0.85358

[[5]]
       Apple Microsoft   Tesla  Amazon
2014 0.47417   0.39066 0.45157 0.13961
2015 0.42300   0.47289 0.12624 0.74952
2016 0.23966   0.50018 0.67329 0.85358
2017 0.20076   0.88752 0.50868 0.22111

注意

我们将它用于x

Lines <- "         Apple Microsoft     Tesla    Amazon
 2010 0.8533719 0.8078440 0.2620114 0.1869552
 2011 0.7462573 0.5127501 0.5452448 0.1369686
 2012 0.7580671 0.5062639 0.7847919 0.8362821
 2013 0.3154078 0.6960258 0.7303597 0.6057027
 2014 0.4741735 0.3906580 0.4515726 0.1396147
 2015 0.4230036 0.4728911 0.1262413 0.7495193
 2016 0.2396552 0.5001825 0.6732861 0.8535837
 2017 0.2007575 0.8875209 0.5086837 0.2211072"

x <- read.table(text = Lines)

【讨论】:

  • 感谢您的回答....不过我有一个问题,rollapply 函数中的 c 究竟是做什么的?我找不到任何解释
  • 参见?c 在单个向量输入的情况下(这是这里的情况),它具有输出其输入的效果。 identity 可以交替使用。
猜你喜欢
  • 2018-11-25
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
相关资源
最近更新 更多