如何为列中的每个名称值做一个时间序列,分解并全部导出到 table

How to do a time series for each name value in column, decompose and export all to table

我有一个包含多个列的数据框 (DF),但目标列是日期、索引和站点。 子集 table 在这里:https://www.dropbox.com/s/48165ey5rsv628c/DATA.csv?dl=0

SITE    date        index
A       2006.001    0.394
A       ..          1.408
A       2015.353    1.295
B       2006.001    0.176
B       ..          2.354
B       2015.353    0.417
C       2006.001    0.232
C       ..          1.733
C       2015.353    0.653

时间序列从 2006 年 julian 第 1 天开始,到 2015 年 jd 353 结束,全年有 23 个观测值。

INDEX_TS <- ts(DF$index, start = c(2006,1), end = c(2015,23), frequency = 23)

然后我用stl分解它,得到每个日期的季节、趋势和余数。

stl(INDEX_TS, 12)

 Call:
 stl(x = INDEX_TS, s.window = 12)

Components
Time Series:
Start = c(2008, 18) 
End = c(2017, 16) 
Frequency = 23 
             seasonal     trend   remainder
2006.000  0.244352688 0.9678620 -0.34804205
...       ...         ...       ...
2015.957  0.191399568 1.5224135  0.57215711

要提取到 table seasonaltrendremainder

STL12 <- stl(INDEX_TS, 12)
DF_STL <- data.frame(STL12, INDEX_TS$time.series)

但只会产生包含指数、季节、趋势和余数的 df。

我可以分别为每个网站做这件事,将 DF 逐一细分,但真正的 DF 有许多不同的网站名称。

我需要的最终 DF 是一个具有每个站点的分解值的 DF,例如:

SITE    date        index    seasonal    trend     remainder
A       2006.001    0.394    x1        y1        z1
A       ..          1.408    x2        y2        z2
A       2015.353    1.295    x3        y3        z3
B       2006.001    0.176    x4        y4        z4
B       ..          2.354    x5        y5        z5
B       2015.353    0.417    x6        y6        z6
C       2006.001    0.232    x7        y7        z7
C       ..          1.733    x8        y8        z8
C       2015.353    0.653    x9        y9        z9

尝试以下操作。这 splitSITE 构成的数据帧,将 index 作为 tsdecompose 存储在每个 SITE 中,并与原始子集组合。最后,do.call rbind将所有子集+分解成最终数据帧:

可重现的例子:

AirData = data.frame(AirPassengers, SITE = rep(c("A", "B", "C"), each = 48))

do.call(rbind, lapply(split(AirData, AirData$SITE), function(x) {
  INDEX_TS <- ts(x$AirPassengers, frequency = 12)
  STL12 <- stl(INDEX_TS, 12)$time.series
  return(data.frame(x, STL12))
}))

结果:

     AirPassengers SITE   seasonal    trend  remainder
A.1            112    A -13.986104 123.5683  2.4177707
A.2            118    A  -7.759212 124.1061  1.6531607
A.3            132    A   8.325181 124.6438 -0.9689496
A.4            129    A  -1.887274 125.1815  5.7057890
A.5            121    A  -5.517268 125.7871  0.7302135
A.6            135    A  12.098461 126.3926 -3.4910836
A.7            148    A  27.559203 126.9982 -6.5573953
A.8            148    A  28.502489 127.5898 -8.0922545
A.9            136    A   9.726413 128.1813 -1.9077517
A.10           119    A -12.472175 128.7729  2.6992637
A.11           104    A -31.553871 129.7343  5.8195429
A.12           118    A -13.061798 130.6957  0.3660530
A.13           115    A -13.978583 131.6572 -2.6785793
A.14           126    A  -7.772715 133.1337  0.6389980
A.15           141    A   8.281701 134.6103 -1.8919729
A.16           135    A  -2.206362 136.0868  1.1195345
A.17           125    A  -5.580592 137.8077 -7.2271040
A.18           149    A  12.368207 139.5286 -2.8967712
A.19           170    A  27.747586 141.2494  1.0029824
A.20           170    A  28.926157 143.7331 -2.6593066
...            ...  ...        ...      ...        ...

OP的例子:

do.call(rbind, lapply(split(DF, DF$SITE), function(x) {
  INDEX_TS <- ts(x$index, start = c(2006,1), end = c(2015,23), frequency = 23)
  STL12 <- stl(INDEX_TS, 12)$time.series
  return(data.frame(x, STL12))
}))