如何将data.frame转换为时间序列?as.ts转换结果是否正确?
关于data.frame转时间序列的疑问解答
嘿,我来帮你理清楚这个时间序列转换的问题~
首先直接说结论:你用as.ts(myData)做的转换并不符合你的预期需求,原因我给你拆解下:
- 你的
myData是包含Sales(待分析的数值)和Year(时间索引)的两列data.frame,as.ts()会把整个data.frame当成多变量时间序列(也就是mts类型),相当于把Year也当成了一个要分析的时间序列变量,但实际上Year是用来标记时间轴的,不是变量本身。 - 另外你注意到没?你的
Sales列里有逗号(比如2,385),这种格式是字符型,不是数值型,就算转成时间序列也没法做后续的分析,这也是个隐藏问题。
接下来给你讲正确的转换步骤,分两步走:
第一步:先清理Sales列,转成数值型
带逗号的字符串没法被R识别为数值,得先把逗号去掉再转换:
# 去掉Sales里的逗号,再转成数值类型 myData$Sales <- as.numeric(gsub(",", "", myData$Sales))
第二步:基于Year构建正确的时间序列
这里分两种常见场景:
场景1:同一年有多个观测值(比如你的数据里2016年有6条Sales记录)
这种属于年度内的高频数据(比如月度、季度,或者自定义周期),用基础R的ts()函数,指定start(起始时间)和frequency(每年的观测次数)就可以:
# 先确保数据按年份排序(避免顺序混乱) myData <- myData[order(myData$Year), ] # 举个例子:假设2016年的6条数据是半年内的月度数据(frequency=12) data.ts <- ts(myData$Sales, start = c(2016, 1), frequency = 12) # 如果不确定具体周期,只是按每年6次观测算,也可以这么写 data.ts <- ts(myData$Sales, start = 2016, frequency = 6)
场景2:每年只需要一个汇总的观测值(年度时间序列)
如果你的需求是按年份汇总Sales(比如求和/均值),再转成年度时间序列,那就先聚合数据再转换:
# 按Year分组,计算每年的总Sales(也可以换成mean求均值) annual_sales <- aggregate(Sales ~ Year, data = myData, sum) # 转成年度时间序列,frequency=1代表每年1次观测 data.ts <- ts(annual_sales$Sales, start = min(annual_sales$Year), frequency = 1)
最后再强调下:as.ts()直接转多列data.frame的时候,默认是把每一列都当成一个时间序列变量,所以才会得到mts类型,这和你想用Year做时间索引的需求不匹配,一定要先处理数据,再用ts()指定时间参数来构建~
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

