簡體   English   中英

為hts字符參數R創建正確的輸入名稱

[英]Create proper input names for the hts character argument R

這個問題與hts軟件包沒有必要,但是其動機來自於需要在hts軟件包的列名稱中指定層次結構(函數hts參數“ characters”)

原始數據:

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”

原始數據層次結構的圖示:

在此處輸入圖片說明 character參數要求:

整數表示可讀取底層名稱的段,以構造相應的節點結構及其標簽。 例如,假設最下面的系列之一被稱為“ 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個級別的長度: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)

我的一般解決方案是:(盡管我實際上並沒有設法將其正確地表達為代碼,但絕對不是一種優雅的方法)為了將其轉換為正確的格式,我想到了首先找到所有四個級別的最大值( (對於“名稱”的所有值),然后對所有“名稱”運行一個循環,並在循環中拆分每個級別,如果其級別短於其級別,則粘貼必要的ll,因此它將具有與所有其他TS相同的名稱長度在同等水平

這是嘗試使用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到較短的值>用_分隔符將所有內容組合回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM