自动更改矩阵长度和行名称

时间:2015-01-07 12:49:30

标签: r matrix automation

我的数据每个季度都会延长,并会在不同的数据集中改变开始日期。

我编写了一个代码,该代码运行大量测试并生成预测,并自动记录数据的图形和表格。

一切正常,直到数据长度或开始日期发生变化,因为表格中的数据长度不正确或与正确的季度不匹配。

以下是一个例子:

Test.data <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27)

Test.dates <- c("08Q1","08Q2","08Q3","08Q4","09Q1","09Q2","09Q3","09Q4","10Q1","10Q2","10Q3","10Q4","11Q1","11Q2","11Q3","11Q4","12Q1","12Q2","12Q3","12Q4","13Q1","13Q2","13Q3","13Q4","14Q1","14Q2","14Q3")

Test <- matrix(c(Test.data,""),nrow=4,byrow=FALSE)

colnames(Test) <- c("'08","'09","'10","'11","'12","'13","'14")
rownames(Test) <- c("Qtr 1", "Qtr 2", "Qtr 3", "Qtr 4")

非常好地给出了:

     '08  '09  '10  '11  '12  '13  '14
Qtr 1 1    5    9    13   17   21   25
Qtr 2 2    6    10   14   18   22   26
Qtr 3 3    7    11   15   19   23   27
Qtr 4 4    8    12   16   20   24

然而,在下一季度,数据将增加1并出现错误:

Warning message:
In matrix(c(Test.data, ""), nrow = 4, byrow = FALSE) :
  data length [29] is not a sub-multiple or multiple of the number of rows [4]

Error in `colnames<-`(`*tmp*`, value = c("'08", "'09", "'10", "'11", "'12",  : 
  length of 'dimnames' [2] not equal to array extent

或者,如果数据集在08Q2而不是08Q1开始,那么数据将全部在错误的四分之一旁边。

我需要以特定的方式显示我的数据:

      'yr1  'yr2  'yr3  ...
Qtr 1
Qtr 2
Qtr 3
Qtr 4

有没有人有任何关于我如何能够自动更改以适应我的数据而不必更改任何内容的任何建议(因为很快它将加入数据库,这将不断产生结果,因此每次都无法更改数据的长度不同)

谢谢你的帮助。

如果您想了解更多信息,请在下面发表评论

2 个答案:

答案 0 :(得分:2)

Test.data.padded <- as.character(Test.data)
length(Test.data.padded) <- ceiling(length(Test.data.padded) / 4) * 4
Test.data.padded[is.na(Test.data.padded)] <- ""

Test <- matrix(Test.data.padded, nrow=4, byrow=FALSE)

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] "1"  "5"  "9"  "13" "17" "21" "25"
#[2,] "2"  "6"  "10" "14" "18" "22" "26"
#[3,] "3"  "7"  "11" "15" "19" "23" "27"
#[4,] "4"  "8"  "12" "16" "20" "24" ""  

然后使用正则表达式从Test.dates中提取年份。

答案 1 :(得分:1)

不确定这是否有帮助。

library(stringi)
n <- 4
l <- length(Test.data)
m1 <- stri_list2matrix(split(Test.data,as.numeric(gl(l,n,l))), fill='')
nm1 <- do.call(rbind,strsplit(Test.dates, '(?<=[0-9])(?=[Q])', perl=TRUE))
dimnames(m1) <- list(unique(nm1[,2]), unique(nm1[,1]))
m1
#    08  09  10   11   12   13   14  
#Q1 "1" "5" "9"  "13" "17" "21" "25"
#Q2 "2" "6" "10" "14" "18" "22" "26"
#Q3 "3" "7" "11" "15" "19" "23" "27"
#Q4 "4" "8" "12" "16" "20" "24" ""