通过串联重塑,使R中的每个变量都有一个单独的时间序列
希望以一种有助于我创建用于时间序列分析的数据集的方式,用下面的结构重塑数据集 下面的数据集是一个示例,我有多个变量作为列,多个品牌作为行以及它们各自的时间段通过串联重塑,使R中的每个变量都有一个单独的时间序列,r,reshape,reshape2,melt,R,Reshape,Reshape2,Melt,希望以一种有助于我创建用于时间序列分析的数据集的方式,用下面的结构重塑数据集 下面的数据集是一个示例,我有多个变量作为列,多个品牌作为行以及它们各自的时间段 品牌周期V1 V2 V3 一周1 1 2 3 一周2 1 2 3 一周3 1 2 3 B周1 1 2 3 B周2 1 2 3 B周3 1 2 3 C周1 1 2 3 C周2 1 2 3 C周3 1 2 3 数据集如下所示: 周期A_V1 A_V2 A_V3 B_V1 B_V2 B_V3 C_V1 C_V2 C_V3 周1 周2 第3周
品牌周期V1 V2 V3
一周1 1 2 3
一周2 1 2 3
一周3 1 2 3
B周1 1 2 3
B周2 1 2 3
B周3 1 2 3
C周1 1 2 3
C周2 1 2 3
C周3 1 2 3
数据集如下所示:
周期A_V1 A_V2 A_V3 B_V1 B_V2 B_V3 C_V1 C_V2 C_V3
周1
周2
第3周
我想知道重塑包或我可以使用的任何其他包中是否有一些功能如果你习惯了
tidyverse
,你可以使用从tidyr
收集和传播的组合(与答案类似):
基本操作可以在一个read.zoo调用中完成,该调用将:
- 读取brands.dat文件(在末尾的注释中重复定义)——如果您有一个数据框作为输入,则使用下面注释掉的行,而不是未注释的行
- 按品牌划分数据李>
结果是一个动物园系列z
。序列可以直接以这种形式操作,也可以使用fortify.zoo(z)
转换为数据帧,或者通过将索引聚合为数值(如下文所示),然后使用as.ts(z)
转换为ts序列
如果您希望列名完全符合问题中所示的格式,请添加以下内容:
colnames(z) <- sub("(\\w+)[.](\\w+)", "\\2_\\1", colnames(z))
time(z) <- 1:nrow(z)
或者这个:
time(z) <- as.numeric(gsub("\\D", "", time(z))
time(z)我们可以使用data.table
中的dcast
来获取多个value.var
列
library(data.table)
dcast(setDT(df1), Period ~ Brand, value.var =names(df1)[3:5])
# Period V1_A V1_B V1_C V2_A V2_B V2_C V3_A V3_B V3_C
#1: Week1 1 1 1 2 2 2 3 3 3
#2: Week2 1 1 1 2 2 2 3 3 3
#3: Week3 1 1 1 2 2 2 3 3 3
从数据中查看dcast
表
即dcast(setDT(df1),Period~Brand,value.var=c(“V1”,“V2”,“V3”))
他们正在寻找一种解决方案,我不需要为每种情况键入变量名,比如“V1”,“V2”等,然后您可以使用名称(df1)[3:5]
that@akrun这很有效!这同样有效,但我发现@akrun解决方案目前更可行。顺便说一句,如果你不介意的话,你能解释一下这行代码吗?colnames(z)匹配一个或多个单词字符,后跟一个点,后跟一个或多个单词字符。括号定义了捕获组。替换字符串然后指定与第二个捕获组的匹配、下划线和与第一个捕获组的匹配。
colnames(z) <- sub("(\\w+)[.](\\w+)", "\\2_\\1", colnames(z))
time(z) <- 1:nrow(z)
time(z) <- as.numeric(gsub("\\D", "", time(z))
Lines <- "
Brand Period V1 V2 V3
A Week1 1 2 3
A Week2 1 2 3
A Week3 1 2 3
B Week1 1 2 3
B Week2 1 2 3
B Week3 1 2 3
C Week1 1 2 3
C Week2 1 2 3
C Week3 1 2 3"
cat(Lines, file = "brands.dat")
brands <- read.table(text = Lines, header = TRUE)
library(data.table)
dcast(setDT(df1), Period ~ Brand, value.var =names(df1)[3:5])
# Period V1_A V1_B V1_C V2_A V2_B V2_C V3_A V3_B V3_C
#1: Week1 1 1 1 2 2 2 3 3 3
#2: Week2 1 1 1 2 2 2 3 3 3
#3: Week3 1 1 1 2 2 2 3 3 3