英文:
Compute lagged time series data
问题
以下是翻译好的部分:
让我们假设我有这些数据
> data <- dplyr::tibble(v = c(1:10))
> data
# A tibble: 10 × 1
v
<int>
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
我现在想创建一个形状为 11x5x1
的数组。特别地,行应该具有以下模式:
NA NA NA NA NA
NA NA NA NA 1
NA NA NA 1 2
NA NA 1 2 3
NA 1 2 3 4
1 2 3 4 5
....
有任何想法如何做到这一点吗?
谢谢!
编辑:
在使用二维时间序列时如何扩展这个方法?
英文:
Let's say I have this data
> data <- dplyr::tibble(v = c(1:10))
> data
# A tibble: 10 × 1
v
<int>
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
I now want to create an array with the shape 11x5x1
. Particularly, the rows should have the following pattern:
NA NA NA NA NA
NA NA NA NA 1
NA NA NA 1 2
NA NA 1 2 3
NA 1 2 3 4
1 2 3 4 5
....
and so on. Any ideas how to do so?
Thanks!
EDIT:
How to extend this when using a 2d timeseries?
答案1
得分: 1
1) 在前面放置5个NA,然后使用 embed
。然后使用5:1反转每一行。不使用任何包。
embed(c(rep(NA, 5), data$v), 5)[, 5:1]
得到的结果如下:
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA 1
[3,] NA NA NA 1 2
[4,] NA NA 1 2 3
[5,] NA 1 2 3 4
[6,] 1 2 3 4 5
[7,] 2 3 4 5 6
[8,] 3 4 5 6 7
[9,] 4 5 6 7 8
[10,] 5 6 7 8 9
[11,] 6 7 8 9 10
2) rollapply 另一种方法是使用 rollapplyr
。
library(zoo)
rollapplyr(c(rep(NA, 5), data$v), 5, c)
英文:
1) Place 5 NA's in front and then use embed
. Then reverse each row using 5:1. No packages are used.
embed(c(rep(NA, 5), data$v), 5)[, 5:1]
giving
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA 1
[3,] NA NA NA 1 2
[4,] NA NA 1 2 3
[5,] NA 1 2 3 4
[6,] 1 2 3 4 5
[7,] 2 3 4 5 6
[8,] 3 4 5 6 7
[9,] 4 5 6 7 8
[10,] 5 6 7 8 9
[11,] 6 7 8 9 10
2) rollapply An alternative is to use rollapplyr
.
library(zoo)
rollapplyr(c(rep(NA, 5), data$v), 5, c)
答案2
得分: 0
使用 sapply
:
nr = 11 # 输出中的行数
nc = 5 # 输出中的列数
v = 1:10 # 初始向量
sapply(nc:1, function(x) c(rep(NA, x), v)[1:nr])
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA 1
# [3,] NA NA NA 1 2
# [4,] NA NA 1 2 3
# [5,] NA 1 2 3 4
# [6,] 1 2 3 4 5
# [7,] 2 3 4 5 6
# [8,] 3 4 5 6 7
# [9,] 4 5 6 7 8
# [10,] 5 6 7 8 9
# [11,] 6 7 8 9 10
使用 data.table::shift
:
library(data.table)
do.call(cbind, shift(1:11, 1:6, type = 'lag'))[, 5:1]
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA 1
# [3,] NA NA NA 1 2
# [4,] NA NA 1 2 3
# [5,] NA 1 2 3 4
# [6,] 1 2 3 4 5
# [7,] 2 3 4 5 6
# [8,] 3 4 5 6 7
# [9,] 4 5 6 7 8
# [10,] 5 6 7 8 9
# [11,] 6 7 8 9 10
英文:
With sapply
:
nr = 11 #Number of rows in output
nc = 5 #Number of cols in output
v = 1:10 #Initial vector
sapply(nc:1, function(x) c(rep(NA, x), v)[1:nr])
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA 1
# [3,] NA NA NA 1 2
# [4,] NA NA 1 2 3
# [5,] NA 1 2 3 4
# [6,] 1 2 3 4 5
# [7,] 2 3 4 5 6
# [8,] 3 4 5 6 7
# [9,] 4 5 6 7 8
# [10,] 5 6 7 8 9
# [11,] 6 7 8 9 10
With data.table::shift
:
library(data.table)
do.call(cbind, shift(1:11, 1:6, type = 'lag'))[, 5:1]
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA 1
# [3,] NA NA NA 1 2
# [4,] NA NA 1 2 3
# [5,] NA 1 2 3 4
# [6,] 1 2 3 4 5
# [7,] 2 3 4 5 6
# [8,] 3 4 5 6 7
# [9,] 4 5 6 7 8
# [10,] 5 6 7 8 9
# [11,] 6 7 8 9 10
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论