使用1列数据填充R矩阵

时间:2014-06-06 22:42:38

标签: r matrix

假设我有一个向量

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没有值

我环顾四周,但似乎无法找到这个特殊的例子。

5 个答案:

答案 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)

您可以使用rbindcbind

在一行中执行此操作
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