2013-06-04 6 views
1

J'ai une question apparemment simple que je ne peux pas comprendre. Je voudrais prendre un ensemble de données dans lequel chaque période de temps a sa propre variable (c'est-à-dire la colonne) pour une observation et la reformater de telle sorte que chaque observation a juste une variable qui varie au cours des périodes. Mes données actuelles ressemble:Remodeler les données en séries chronologiques en utilisant R

obs <- 1:4 
y1 <- 5:8 
y2 <- 9:12 
data_matrix <- cbind(obs, y1, y2) 

qui produit:

 obs y1 y2 
[1,] 1 5 9 
[2,] 2 6 10 
[3,] 3 7 11 
[4,] 4 8 12 

et je voudrais qu'il ressemble (en créant une période variable de temps, T):

 obs T y2 
[1,] 1 1 5 
[2,] 1 2 9 
[3,] 2 1 6 
[4,] 2 2 10 
[5,] 3 1 7 
[6,] 3 2 11 
[7,] 4 1 8 
[8,] 4 2 12 

Merci pour tout conseil sur la façon de remodeler cela.

Répondre

1

Vous pouvez remodeler vos données:

data_matrix<-data.frame(data_matrix) 
reshape(data_matrix,varying=list(2:3),times=names(data_matrix)[2:3],idvar="obs",v.names="value",direction="long") 

retours:

 obs time value 
1.y1 1 y1  5 
2.y1 2 y1  6 
3.y1 3 y1  7 
4.y1 4 y1  8 
1.y2 1 y2  9 
2.y2 2 y2 10 
3.y2 3 y2 11 
4.y2 4 y2 12 

Vous pouvez ensuite trier par obs.

+0

Merci - j'apprécie l'aide; le remodeler() a travaillé pour moi –

1

La racine de votre problème est que cbind() est pour ajouter des colonnes et vous souhaitez combiner les lignes et les colonnes. Il y a beaucoup de façons différentes d'aborder, mais si votre exemple est en fait ce simple (ex: seulement ces quelques colonnes), il est facile de créer simplement deux trames de données via data.frame() puis les combiner via rbind():

> rbind(data.frame(obs,y2=y1,T=1),data.frame(obs,y2,T=2)) 
    obs y2 T 
1 1 5 1 
2 2 6 1 
3 3 7 1 
4 4 8 1 
5 1 9 2 
6 2 10 2 
7 3 11 2 
8 4 12 2 
Questions connexes