2015-12-02 17 views
1

這個問題創建正確的輸入名稱是沒有必要的相關的hts包,但它的動機是從需求得出的指定的hts包(列名功能hts參數「字符中的層級「)高溫超導字符參數[R

原始數據:

library(data.table) 
Original<-data.table(column_names=c("12_2985_40_4025", "12_2986_26_4027", 
      "12_3385_17_4863", "48_2570_433_3376")) 
Original[,nchar:=nchar(column_names)] 
Original 

原始

   names nchar 
1: 12_2985_40_4025 15 
2: 12_2986_26_4027 15 
3: 12_3385_17_4863 15 
4: 48_2570_433_3376 16 

請注意,每行由一個層次結構中構建的單個時間序列的4個粘貼標籤組成,例如Original$names[1]: "12_2985_40_4025,是一個時間系列「12」,子類型「2985」,子子類型「40」和唯一標識符「4025」

插圖原始數據層次的:

enter image description here 字符參數要求:

整數表示,其中底部級別名稱可以是 讀爲了構建區段相應的節點結構及其 標籤。例如,假設底部系列之一被命名爲 「VICMelb」,指的是維多利亞州境內的墨爾本市。然後字符將被指定爲c(3,4),其參考3個字符(例如,「VIC」)的 狀態和4個字符的城市(例如, 「Melb」)。所有的底部名稱必須具有相同的長度,其中每個片段的字符數 對於所有系列都是相同的。

所以我需要轉換的「原始」格式轉換「需要」的格式,這樣我就可以進一步將其輸入到hts對象,發現我已經爲了加入「L」(可以是任何字符)到創建相同長度的所有子子水位:

required<-data.table(names=c("12_2985_40l_4025", "12_2986_26l_4027", 
          "12_3385_17l_4863", "48_2570_433_3376")) 
required[,nchar:=nchar(names)] 
required 

需要

   names nchar 
1: 12_2985_40l_4025 16 
2: 12_2986_26l_4027 16 
3: 12_3385_17l_4863 16 
4: 48_2570_433_3376 16 

所以現在從hts下面的代碼將工作,因爲,每個「名稱」將被分成4個級別的lengt的H:3,5,4,4(包括下劃線):

library(hts) 
abc <- ts(5 + matrix(sort(rnorm(1000)), ncol = 4, nrow = 100)) 
colnames(abc) <- required$names 
y <- hts(abc, characters=c(3,5,4,4)) #this would work after properly fixing 
Alert_forecast <- forecast(y, h=10, method="comb") 
plot(Alert_forecast, include=10) 

通用的解決方案,不過,我覺得的: (雖然我真的沒能正確地制定成代碼,不挑釁優雅的一個) 爲了將其轉換爲正確的格式,我想先找到所有4個級別的最大值(對於所有的「名稱」值),然後對所有「名稱」運行一個循環,並將每個級別分成一個循環,以及如果它的水平較短,粘貼必要的ll,那麼它將具有與其他同等水平TS相同的名稱長度。

回答

1

下面是該使用stringi包來解決,企圖

library(data.table) #V 1.9.6+ 
library(stringi) 
Original[, tstrsplit(column_names, "_", fixed = TRUE) 
     ][, lapply(.SD, function(x) stri_pad_right(x, max(nchar(x)), "l")) 
      ][, do.call(paste, c(sep = "_", .SD))] 

## [1] "12_2985_40l_4025" "12_2986_26l_4027" "12_3385_17l_4863" "48_2570_433_3376" 

這裏的想法是:斯普利特_>找到每列最大長度>墊l s到更短的值>與結合一切恢復_分離器。

+0

更改第一行以使用新的'tstrsplit'函數(奇怪地忘了它)... –

+0

謝謝,虐待嘗試:) –