假设我有一个向量
x <- c(1:30)
我想要做的是创建一个说nrow = 30&amp;的矩阵。 ncol = 3并使用从第3行开始的向量得到a矩阵(1,2,3),第4行=(2,3,4),第5行=(3,4,5)等等直到我最终在第30行(28,29,30)结束。
第1行和第1行2没有值
我环顾四周,但似乎无法找到这个特殊的例子。
答案 0 :(得分:4)
我认为您正在寻找鲜为人知的embed
函数:
rbind(NA,NA, embed( 1:30, 3)[,3:1] )
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
[3,] 1 2 3
[4,] 2 3 4
[5,] 3 4 5
[6,] 4 5 6
[7,] 5 6 7
[8,] 6 7 8
snipped....
[27,] 25 26 27
[28,] 26 27 28
[29,] 27 28 29
[30,] 28 29 30
答案 1 :(得分:2)
x <- sapply(1:3, function(i) c(rep(NA, 3-i), x, rep(NA, i)))
x[1,] <- x[2,] <- NA
x <- x[1:30,]
答案 2 :(得分:2)
您可以使用rbind
和cbind
:
rbind(NA, NA, cbind(x[1:(length(x)-2)], x[2:(length(x)-1)], x[c(-1, -2)]))
# [,1] [,2] [,3]
# [1,] NA NA NA
# [2,] NA NA NA
# [3,] 1 2 3
# [4,] 2 3 4
# [5,] 3 4 5
# [6,] 4 5 6
# [7,] 5 6 7
# [8,] 6 7 8
# [9,] 7 8 9
# [10,] 8 9 10
# [11,] 9 10 11
# [12,] 10 11 12
# [13,] 11 12 13
# [14,] 12 13 14
# [15,] 13 14 15
# [16,] 14 15 16
# [17,] 15 16 17
# [18,] 16 17 18
# [19,] 17 18 19
# [20,] 18 19 20
# [21,] 19 20 21
# [22,] 20 21 22
# [23,] 21 22 23
# [24,] 22 23 24
# [25,] 23 24 25
# [26,] 24 25 26
# [27,] 25 26 27
# [28,] 26 27 28
# [29,] 27 28 29
# [30,] 28 29 30
答案 3 :(得分:0)
a <- matrix(NA,nrow=30,ncol=3)
for(i in 1:ncol(a)) a[3:30,i]<- (1:30)[i:(i+28-1)]
a
答案 4 :(得分:0)
又一种方法:
make_mat <- function(x, nrow, ncol)
{
seqx <- seq_along(x)
do.call(rbind,
c(as.list(rep(NA, (ncol - 1))),
list(t(mapply(function(i, j) x[i:j],
head(seqx, -(ncol - 1)),
head(seqx, -(ncol - 1)) + (ncol - 1))))))
}
make_mat(1:5, 5, 3)
# [,1] [,2] [,3]
#[1,] NA NA NA
#[2,] NA NA NA
#[3,] 1 2 3
#[4,] 2 3 4
#[5,] 3 4 5
set.seed(101); x = runif(5)
x
#[1] 0.37219838 0.04382482 0.70968402 0.65769040 0.24985572
make_mat(x, 5, 3)
# [,1] [,2] [,3]
#[1,] NA NA NA
#[2,] NA NA NA
#[3,] 0.37219838 0.04382482 0.7096840
#[4,] 0.04382482 0.70968402 0.6576904
#[5,] 0.70968402 0.65769040 0.2498557