2017-11-30 23 views
-1

데이터 프레임 (DF)에 여러 열이 있지만 대상 열은 날짜, 색인 및 사이트입니다. 부분 집합 테이블은 여기에 있습니다 : 타임 시리즈는 올해 23 명 관찰과 353 JD 2015 년 2006 율리우스 1 일에 시작과 끝 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 

.

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

그럼 내가 STL과 및 각 날짜의 계절, 트렌드 및 나머지 obtein을 분해.
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 

는 테이블 seasonal, trendremainder로 추출하려면

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

하지만 인덱스, 계절, 트렌드와 나머지와 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 
+0

@useR 변명 내 수정 –

+0

@useR 각각의 사이트가 서로 다른 행동을하기 때문에 각 사이트는 동일한 날짜에 다른 분해 값을 갖기 때문에 각 사이트를 개별적으로 분해하려고합니다. –

답변

0

은 다음을 시도해보십시오

내가 필요로하는 최종 DF

처럼, 각 사이트의 드 분해 값입니다. 이 split의 데이터 프레임은 SITE이고 index을 각 SITEts, decompose으로 저장하고 원래의 하위 집합과 결합합니다.

재현 예 :

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의 예 :

0,123,336,089 최종 dataframe에 마지막으로 do.call rbind의 모든 부분 집합은 + decopositions
+0

'ts (x $ LAI, 시작 = c (2006, 1), 끝 = c (2017, 17), 빈도 = 23)의 오류 : 'ts'객체가 하나 이상의 관측치를 가져야 함 ' 유용하다. 그러나 나를 오류로 보내라. –

+0

@OSCAR_P 각'SITE'는 같은 수의 관측치를 가지고 있나? 이 코드는 내 솔루션의 코드와 다릅니다. 또한'dput (DF) '의 출력을 복사하여 붙여 넣기하여 재현 할 수있는 예제를 제공하십시오. – useR

+0

나는 그것을 바로 잡았다. 사실이 예제는 매우 훌륭하게 작동하지만, 주요 차이점은 에어패스가 시간 순서대로있는 AirData 테이블에 있습니다. 이제 stl (INDEX_TS, 12)에서 에러가 발생했습니다 : 외부 함수 호출에서 NA/NaN/Inf (arg 1) 호출자 : stl (INDEX_TS, 12)' –