首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为hts字符参数R创建正确的输入名称

为hts字符参数R创建正确的输入名称
EN

Stack Overflow用户
提问于 2015-12-02 12:06:50
回答 1查看 713关注 0票数 1

这个问题与hts包无关,但其动机来自于需要在hts包中指定列名中的层次结构(函数hts参数“字符”)。

原始数据:

代码语言:javascript
复制
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

原创

代码语言:javascript
复制
              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”的时间序列。

说明原始数据层次结构:

字符参数要求:

整数表示可以读取底层名称的段,以便构造相应的节点结构及其标签。例如,假设下面的一个系列被命名为"VICMelb“,指的是维多利亚州内的墨尔本市。然后将字符指定为c(3,4),表示3个字符(例如“国际中心”)和4个字符(例如"Melb")的状态,所有底部名称必须具有相同的长度,每个片段的字符数与所有系列的字符数相同。

因此,我需要将“原始”格式转换为“必需”格式,以便进一步将其输入到hts对象中,注意到我添加了"l“(可以是任何字符),以便为所有子级别创建相同的长度:

代码语言:javascript
复制
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

必填项

代码语言:javascript
复制
              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(包括下划线):

代码语言:javascript
复制
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个级别的最大值(对于“名称”的所有值),然后在所有“名称”上运行一个循环,然后在一个循环中分割每个级别,如果它的级别较短,那么它就会粘贴必要的11级,这样它的名称长度就会与其同等级别的所有其他TS一样长。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-02 12:28:32

下面是使用stringi包解决这一问题的尝试

代码语言:javascript
复制
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"

这里的想法是:按_拆分>找到每列的最大长度> pad ls到较短的值>将所有内容与_分隔符组合起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34042346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档