2015-03-10 2 views
0

Я думаю, что, возможно, отсутствует что-то очень просто, но:Заполните последнее место матрицы с 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 марта должны быть заполнены с НС.

+4

'м [28: длина (м)] <- NA'? Вы не можете избежать утилизации ценностей. – Roland

+1

Боковое примечание: существует встроенная константа для имен месяцев: 'month.abb',' month.name'. – zx8754

ответ

1

Если вы назначаете более короткий вектор длинному вектору в R, он перерабатывает значения в более коротком векторе. Вот что вы здесь наблюдаете. (Обратите внимание, что матрица - это просто вектор с атрибутом измерения.) Этого поведения нельзя избежать. Таким образом, вы должны назначить NA после создания матрицы:

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

Или, в качестве альтернативы, вы можете добавить необходимое количество NA значений 1:27 при создании матрицы.

1

Создайте список dimnames и создайте матрицу NA. И, наконец, заполнить его:

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 

или a 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) 
Смежные вопросы