用NA填充矩阵的最后一个点

时间:2015-03-10 12:30:28

标签: r matrix

我想我可能会非常简单地遗漏一些东西,但是:

如何用NA填充矩阵的最后几个点,而不是只重复以前的值?

数据示例:

x <- 1:27
m <- matrix(x, nrow = 12, ncol = ceiling(nrow(base.de)/12), byrow = FALSE)

col_names <- c("2013", "2014", "2015")
row_names <- c("Jan", "Feb", "Mar", "Apr", "May", 
             "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

dimnames(m) <- list(row_names, col_names)
m

 2013 2014 2015
Jan    1   13   25
Feb    2   14   26
Mar    3   15   27
Apr    4   16    1 # NOT NA? 
May    5   17    2 
Jun    6   18    3 
Jul    7   19    4 
Aug    8   20    5 
Sep    9   21    6 
Oct   10   22    7 
Nov   11   23    8 
Dec   12   24    9 

我希望2015年3月之后的所有价值都用NA填充。

2 个答案:

答案 0 :(得分:1)

如果为R中较长的向量分配较短的向量,它会回收较短向量中的值。那是你在这里观察到的。 (请注意,矩阵只是具有维度属性的向量。)无法避免此行为。因此,您应在创建矩阵后指定NA

m[28:length(m)] <- NA

或者,您也可以在创建矩阵时将必要数量的NA值附加到1:27

答案 1 :(得分:1)

创建一个dimnames列表,然后从中创建一个NAs矩阵。最后,填写它:

x <- 1:27 # input as per question
dnm <- list(month.abb, 2013:2015) # list of dimnames

m <- matrix(NA, nrow = length(dnm[[1]]), ncol = length(dnm[[2]]), dimnames = dnm)
m[seq_along(x)] <- x

注意:您可能根本不想这样做,而是创建一个月度时间序列:

 library(zoo)
 z <- zooreg(x, as.yearmon("2013-01"), freq = 12)

,并提供:

> z
Jan 2013 Feb 2013 Mar 2013 Apr 2013 May 2013 Jun 2013 Jul 2013 Aug 2013 
       1        2        3        4        5        6        7        8 
Sep 2013 Oct 2013 Nov 2013 Dec 2013 Jan 2014 Feb 2014 Mar 2014 Apr 2014 
       9       10       11       12       13       14       15       16 
May 2014 Jun 2014 Jul 2014 Aug 2014 Sep 2014 Oct 2014 Nov 2014 Dec 2014 
      17       18       19       20       21       22       23       24 
Jan 2015 Feb 2015 Mar 2015 
      25       26       27 

ts系列:

> as.ts(z)
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2013   1   2   3   4   5   6   7   8   9  10  11  12
2014  13  14  15  16  17  18  19  20  21  22  23  24
2015  25  26  27  

或直接:

ts(x, start = c(2013, 1), freq = 12)
相关问题