从统计包中阅读了embed()
的文档后,我仍然不明白输出。如果有人能以替代/更简单的方式(也是列的顺序(解释下面的示例,我将不胜感激。谢谢!
> x <- 1:10
> embed (x, 3)
[,1] [,2] [,3]
[1,] 3 2 1
[2,] 4 3 2
[3,] 5 4 3
[4,] 6 5 4
[5,] 7 6 5
[6,] 8 7 6
[7,] 9 8 7
[8,] 10 9 8
x <- 1:10
dimension <- 3
embed
函数是用 R 本身编写的,您可以通过在控制台中键入embed
来查看它的源代码。本例代码的主要部分如下
n <- length(x)
m <- n - dimension + 1L
data <- x[1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L]
dim(data) <- c(m, dimension)
所以n
变成 10,m 是n - dimension + 1L
这里就是 8。下一行是最重要的行。我们使用rep.int
命令生成子集x
索引。
1L:m #is
#[1] 1 2 3 4 5 6 7 8
我们重复m
,dimension
次,在这种情况下是
rep.int(m, dimension)
#[1] 8 8 8
dimension:1L #is
#[1] 3 2 1
现在,dimension:1L
的每个值都重复rep.int(m, dimension)
次,这给出了
rep.int(dimension:1L, rep.int(m, dimension))
#[1] 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1
我们从这些返回的数字中减去 1
rep.int(dimension:1L, rep.int(m, dimension)) - 1L
#[1] 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
现在,使用回收技术将上述序列添加到1L:m
中,因此您可以获得
1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L
#[1] 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
以上是来自x
的子集值的索引,因为在这种情况下,我们的x
是1:10
,它将返回相同的值。
x[1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L]
#[1] 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
最后,所有这些数字都以矩阵形式排列,有m
行和dimension
列。
dim(data) <- c(m, dimension)
data
# [,1] [,2] [,3]
#[1,] 3 2 1
#[2,] 4 3 2
#[3,] 5 4 3
#[4,] 6 5 4
#[5,] 7 6 5
#[6,] 8 7 6
#[7,] 9 8 7
#[8,] 10 9 8