2013-04-27 2 views
5

저는 100 년 (1200 데이터 포인트)의 월 데이터와 1 년 단위의 월간 데이터 프레임을 가지고 있습니다. 월간 시계열로 변환하고 여러 가지 방법을 시도했지만 어느 것도 올바른 "임시적"구조를 만들지 않았습니다.데이터 프레임을 월간 시계열로 변환합니다.

문제는 데이터 프레임을 12 가지 변수 (월)의 100 회의 관측치 (년)로 간주하는 R에 있습니다. 여기 내 최신 시도에 대한 재현 코드입니다은 "dummy.df.ts"에서

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12)) 
rownames(dummy.df) <- seq(from=1901, to=2000) 
colnames(dummy.df) <- c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec") 
dummy.df.ts <- ts(as.vector(as.matrix(dummy.df)), start=c(1901,1), end=c(2000,12), frequency=12) 

개체, 행과 열이 열에서 순차적으로 관찰하는 대신 전환되고, 등 모든 januarys의 februarys 함께 적층 하나씩. 올바른 시간 구조를 어떻게 얻을 수 있습니까?

fr.monthly.temp.sample.ts <- ts(as.vector(as.matrix(fr.monthly.temp.sample)),        start=c(1901,1), end=c(1905,12), frequency=12) 

이것은이다 : - :

내 데이터의 예로 1905

fr.monthly.temp.sample 

    JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 
1901 2.7 0.4 4.7 10.0 13.0 16.9 19.2 18.3 15.7 10.6 4.9 3.5 
1902 4.1 3.2 7.5 10.3 10.0 15.1 18.2 17.4 15.0 10.2 6.3 3.5 
1903 3.8 5.9 7.6 7.1 12.9 14.9 17.6 17.3 15.5 12.1 6.9 2.7 
1904 3.0 4.6 5.5 10.3 13.6 16.3 20.2 18.5 13.9 11.2 5.4 4.8 
1905 1.7 4.0 7.4 9.3 11.9 16.5 20.0 17.6 14.7 8.4 5.5 3.8 

Plot of original time series

그리고이 (TS) 호출을 사용하여 이러한 1901 년 월별 온도 값은 출력 나는 시계열 객체를 얻는다 :

fr.monthly.temp.sample.ts 

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
1901 2.7 4.1 3.8 3.0 1.7 0.4 3.2 5.9 4.6 4.0 4.7 7.5 
1902 7.6 5.5 7.4 10.0 10.3 7.1 10.3 9.3 13.0 10.0 12.9 13.6 
1903 11.9 16.9 15.1 14.9 16.3 16.5 19.2 18.2 17.6 20.2 20.0 18.3 
1904 17.4 17.3 18.5 17.6 15.7 15.0 15.5 13.9 14.7 10.6 10.2 12.1 
1905 11.2 8.4 4.9 6.3 6.9 5.4 5.5 3.5 3.5 2.7 4.8 3.8 
변경된 시간적 구조 --Note 617,451,515,

Plot of time series from R code

(열에서 값이 로우에있다 ..) -

덕분.

+0

답변을 수정했습니다. 필자는'plot '에 의해 표시되는 데이터에서 col과 행 사이의 "전환"을 실제로 경험하지 않습니다.아마도 데이터 샘플을 사용하여 불과 몇 년 만에 더 나은 답변을 얻을 수있을뿐만 아니라 얻은 차트를 게시 할 수 있습니다. – Michele

+0

오리지널 데이터와 플롯을 추가하여 잘못된 값의 순서를 표시했습니다. 귀하의 EDIT 1 솔루션은 나에게 내가 원하는 바가 아닌 다변량 시계열을 제공한다. 나는 그것을 추가 처리를위한 단 변량 시리즈로 유지하고 싶다. 편집 2의 경우와 마찬가지로 같은 이유로 as.vector()를 시도했지만 그 주문 문제를 일으키는 작업입니다. 아마도 @Alexander가 게시 한 해결책 # 1이 효과가있을 것입니다. 나는 여전히 그것을 시도해야합니다. – avg

+0

제 편집 1은 해결책이 아니 었습니다 ... 그것은 ts() 작동 방식을 인식하는 것입니다. 제 편집 2는 벡터에서 이미 데이터로 시작되었습니다 ... 전조가 필요하다는 것을 깨닫지 못했습니다 ... round (seq (5,10, length.out = 24), 1)'는 벡터입니다 . 대답에 대해 – Michele

답변

3

넌 트랜스 수 1

용액 (기능 t()를)를 벡터화 전에 매트릭스 :

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200), digits = 2), 
           nrow = 100, ncol = 12)) 
rownames(dummy.df) <- seq(1901, 2000) 
colnames(dummy.df) <- month.abb 
dummy.df.ts <- ts(as.vector(t(as.matrix(dummy.df))), 
        start=c(1901,1), end=c(2000,12), frequency=12) 

해결책 2

당신이 데이터를 melt 수도 날짜순으로 정렬 한 다음 ts() 함수를 적용하십시오.

다음은 데이터 설정입니다. 언어 설정이 영어 인 경우 month.abb을 사용하여 일부 코드를 저장할 수 있지만 다른 언어 로켈에는 강력하지 않습니다.

set.seed(12) 
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12)) 
months <- format(seq.Date(as.Date("2013-01-01"), as.Date("2013-12-01"), 
          by = "month"), format = "%b") 
colnames(dummy.df) <- months 
dummy.df$Year <- seq(1901, 2000) # set as variable, not as rownames 

당신이 관찰 나타내는 1200 행, 각각의 데이터 프레임 그래서 데이터를 용융 :

library("reshape2") 
dummy.df <- melt(dummy.df, id.vars = "Year") 

주문 날짜별로 관찰 :

dummy.df$Date <- as.Date(paste(dummy.df$Year, dummy.df$variable, "01", sep = "-"), 
         format = ("%Y-%b-%d")) 
dummy.df <- dummy.df[order(dummy.df$Date), ] 

그럼 당신은 적용 할 수 있습니다 원하는 순서를 나타내는 ts 객체와 유사한 ts() 호출 :

dummy.df.ts <- ts(dummy.df$value, start=c(1901,1), end=c(2000,12), frequency=12) 
+0

감사합니다. 나는 # 1을 게시하기 전에 # 2를 시도했고 정확한 시간 시리즈 출력을 내게 주었다. 그러나 저는 원래의 df에서 행을 쌓는 것과 같이 값을 열 벡터로 정렬하는 것이었기 때문에 변형을 사용하지 않고이 작업을 수행하는 방법을 알고 싶었습니다. 내가 결과를 일찍 몇 가지 t() 작업을 시도했지만 난 당신이 # 1.에 게시 한 것을 시도 해달라고 생각하지 않는다. .. – avg

+0

해결책 1 정확히 내가 뭘 원하는지 .. 감사합니다! – avg

관련 문제