2015-01-07 3 views
2

Мои данные удлиняются каждый квартал и меняют даты начала в разных наборах данных.Автоматическое изменение длины матрицы и имен строк

Я написал код, который запускает множество тестов и производит прогнозы, и автоматически документируется графиками и таблицами данных.

Все работает нормально до тех пор, пока не изменится длина данных или дата начала, поскольку данные в таблицах либо не имеют правильной длины, либо не соответствуют правильному кварталу.

Вот пример:

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
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.

+0

Thankyou похоже, что это может сработать! Есть ли у вас какие-либо предложения о том, как я это сделаю, если данные начнутся в другой точке, например, 2 квартала вперед (08Q3) –

+0

Я не слышал о регулярном выражении раньше ... что это? –

+0

Используйте регулярное выражение для извлечения чисел в квадратах и ​​добавьте пустые значения спереди в соответствии с этим числом (минус 1). – Roland

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" "" 
Смежные вопросы