如何为列中的每个名称值做一个时间序列,分解并全部导出到 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 seasonal
、trend
和 remainder
:
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
尝试以下操作。这 split
由 SITE
构成的数据帧,将 index
作为 ts
、decompose
存储在每个 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))
}))
我有一个包含多个列的数据框 (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 seasonal
、trend
和 remainder
:
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
尝试以下操作。这 split
由 SITE
构成的数据帧,将 index
作为 ts
、decompose
存储在每个 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))
}))