R中ggmonthplot报参数行数不一致报错的原因与解决方法
问题背景
- 使用1970-2019年车辆行驶里程月度统计数据做时间序列可视化,单条记录对应1个自然月,数据集无缺失值,CSV数据片段如下:
DATE,TRFVOLUSM227NFWA 1970-01-01,80173 1970-02-01,77442 1970-03-01,90223 1970-04-01,89956 1970-05-01,97972 1970-06-01,100035 1970-07-01,106392 1970-08-01,106969 1970-09-01,95254 1970-10-01,96317 1970-11-01,89684 1970-12-01,89911 1971-01-01,85336 1971-02-01,80118 1971-03-01,92974 1971-04-01,98106 1971-05-01,103655 1971-06-01,105433 1971-07-01,112466 1971-08-01,112642 1971-09-01,101290 1971-10-01,102525 1971-11-01,95555 1971-12-01,95515
- 已加载依赖包:
dplyr、tidyr、ggplot2、gridExtra、stats、forecast、lubridate、tseries、zoo - 初始实现代码如下:
library(dplyr) # data management library(tidyr) # data management library(ggplot2) # visualization library(gridExtra) # combine multiple plots library(stats) # basic statistical tools library(forecast) # main time series analysis package library(lubridate) # data formatting library(tseries) # addition to forecast library(zoo) # z-ordered observations (irregular timeseries) data = read.csv("Travelling_Statistics.csv") timeseries = ts(data,start=c(1970,1),frequency=12) # time series in monthly frequency from January 1970 ggmonthplot(timeseries)
- 运行代码触发报错:
Error in data.frame(y = as.numeric(x), year = trunc(time(x)), season = as.numeric(phase)) :
arguments imply differing number of rows: 1176, 588
报错原因
ts()函数接收多列数据框作为输入时,会自动生成多列的多变量时间序列(mts)对象。原始数据包含DATE和TRFVOLUSM227NFWA两列,直接传入ts()后会得到2列的时间序列:一列是日期列被强制转换为的数值,另一列是实际的行驶里程值,总观测长度为单序列的2倍。ggmonthplot()内部处理时,会先把所有序列值拉成一维数值向量,长度为2*588=1176,但从时间索引提取的年份、季节标签长度仅为单序列长度588,二者长度不匹配,因此触发行数不一致的报错。
修复方案
创建时间序列对象时,仅传入需要分析的数值列,排除日期列即可,修复后的代码如下:
data = read.csv("Travelling_Statistics.csv") # 仅传入里程数值列创建ts对象 timeseries = ts(data$TRFVOLUSM227NFWA, start=c(1970,1), frequency=12) ggmonthplot(timeseries)
运行后即可正常生成月度季节图。
内容的提问来源于stack exchange,提问作者Unreal RatzZ
相关产品推荐
相关产品推荐

