2013-04-27 26 views
5

Mam ramkę danych z miesięcznych danych przez 100 lat (1200 punktów danych) z miesiącami w kolumnach i latach w wierszach. Chcę przekonwertować go na szereg miesięcznych szeregów czasowych i próbowałem na kilka sposobów, z których żaden nie tworzy prawidłowej struktury "czasowej".Konwersja ramki danych do miesięcznych szeregów czasowych

Problem dotyczy R biorąc pod uwagę ramkę danych jako 100 obserwacji (lat) 12 zmiennych (miesięcy). Oto kod powtarzalne dla mojej ostatniej próbie:

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) 

W „dummy.df.ts” obiektu, wiersze i kolumny są włączane i zamiast kolejnych obserwacji w kolumnach, wszyscy februarys januarys etc są ułożone razem jedna po drugiej. Jak mogę dostać się do właściwej struktury czasowej?

Przykładem moich danych: są miesięczne wartości temperatury od 1901 - 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

I za pomocą tego ts() połączenia:

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

to jest wyjście otrzymuję dla obiektu szeregów czasowych:

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 

Plot of time series from R code

--Note zmienionej struktury czasowej (wartości z kolumn są teraz w wierszach ..) -

Dzięki.

+0

Edytowałem swoją odpowiedź. Nie doświadczam tego "przełączania" między kolumnami i wierszami danych wyświetlanych przez 'plot'.Prawdopodobnie możesz uzyskać lepsze odpowiedzi, korzystając z próbki danych, zaledwie kilka lat, i publikując otrzymany wykres. – Michele

+0

Dodałem moje oryginalne dane i wykresy, aby pokazać niewłaściwe uporządkowanie wartości. Twoje rozwiązanie EDIT 1 daje mi wielowariantowe szeregi czasowe, które nie są tym, czego chcę, chcę zachować je jako jednowymiarową serię do dalszego przetwarzania. Podobnie jak EDIT 2, próbowałem as.vector() z tego samego powodu, ale to to operacja, która powoduje problem z zamówieniem. być może rozwiązanie # 1 opublikowane przez @Alexander zadziała, nadal muszę to wypróbować. – avg

+0

Moja edycja 1 nie była rozwiązaniem ... miała tylko uświadomić, jak działa ts(). Moja edycja 2 zaczęła się od danych JUŻ w wektorze ... Nie zdawałem sobie sprawy, że potrzebujesz tylko transpozycji ... rundy (seq (5,10, length.out = 24), 1) 'to wektor . – Michele

Odpowiedz

3

Roztwór 1

Można transpozycji (funkcja T()) matrycy przed Wektoryzacja go:

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) 

Roztwór 2

Można melt danych, porządkuj według daty, a następnie zastosuj funkcję ts().

Oto konfiguracja danych. Jeśli twoim ustawieniem języka jest język angielski, możesz zapisać kod za pomocą pliku month.abb, ale nie jest on odporny na inne ustawienia narodowe.

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 

Melt dane więc trzeba ramkę danych z 1200 wierszy, z których każdy reprezentuje spostrzeżenie:

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

Order Obserwacje by Date:

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), ] 

Następnie można zastosować podobne wywołanie ts() z obiektem ts pokazującym pożądaną kolejność:

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

dzięki za odpowiedzi. Próbowałem # 2, zanim opublikowałeś # 1 i dało mi to prawidłowe wyniki w serii czasowej. Ale chciałem wiedzieć, jak to zrobić bez użycia zmiany kształtu, ponieważ to, co robiłem, w zasadzie porządkowało wartości jako wektor kolumnowy, tj. Układanie wierszy z oryginalnego df end-to-end. Próbowałem kilka operacji t() wcześniej bez rezultatu, ale nie sądzę, próbowałem ten, który opublikowałeś w # 1.. Poinformuję cię .. – avg

+0

rozwiązanie 1 robi dokładnie to, co chcę..dzięki! – avg

Powiązane problemy