2017-01-17 3 views
4

J'ai un ensemble de données avec plusieurs points temporels du volume de l'hippocampe pour chaque sujet. Chaque volume de l'hippocampe a une mesure gauche et droite. Je veux maintenant comparer les changements de gauche et de droite longitudinalement. Je sais comment remodeler mes données pour les points de temps, mais je ne sais pas comment ajouter les niveaux de "côté" à cela.Deux niveaux de données longitudinales: comment remodeler?

Voici donc mon ensemble de données reproductibles:

mydata <- data.frame(SID=sample(1:150,400, replace=TRUE), hippLeft_T1=sample(6000:8000,400,replace=TRUE), hippRight_T1=sample(6000:8000,400,replace=TRUE),hippLeft_T2=sample(6000:8000,400,replace=TRUE), hippRight_T2=sample(6000:8000,400,replace=TRUE),hippLeft_T3=sample(6000:8000,400,replace=TRUE), hippRight_T3=sample(6000:8000,400,replace=TRUE)) 

Voici donc comment je remodeler le sens longitudinal:

long <- reshape(mydata, direction="long", varying=list(c(2,4,6),c(3,5,7)),idvar="SID", timevar="time", v.names=c("HippLeft","HippRight"), times=c("time1","time2","time3")) 

Faut-il se refaçonner deux fois pour obtenir les niveaux de gauche et à droite Là? Ou est-ce qu'il y a un autre moyen de le faire? Merci!

** Ce que je suis en train de faire est la suivante: enter image description here

+0

vous pouvez poster un exemple de ce que vous espérez votre les données de sortie ressembleront? –

+1

Donc, je viens d'ajouter un exemple, merci – user6121484

Répondre

3

Une façon de le faire est d'utiliser une combinaison de unite, gather et separate de tidyr:

library(tidyr) 
long <- mydata %>% unite("times1", hippLeft_T1,hippRight_T1) %>% 
        unite("times2", hippLeft_T2,hippRight_T2) %>% 
        unite("times3", hippLeft_T3,hippRight_T3) %>% 
        gather("times","Hipp",times1:times3) %>% 
        separate(Hipp,c("Left","Right")) %>% 
        gather("Side","Hipp",Left:Right) 

Remarques :

  1. Première unite les colonnes de gauche et de droite pour chaque temps T1, T2 et T3 et le nom de ces colonnes times1, times2 et times3
  2. Ensuite, gather ces trois colonnes de noms de la colonne clé times et la colonne de valeur Hipp
  3. separate la colonne Hipp dans Left et Right
  4. gather les colonnes Left et Right nommant la colonne de clé Side et la colonne de valeur Hipp

En fait, une meilleure façon est d'inverser les deux gather opérations de première unificatrice sur des temps:

library(tidyr) 
long <- mydata %>% unite("Left", hippLeft_T1,hippLeft_T2,hippLeft_T3) %>% 
        unite("Right", hippRight_T1,hippRight_T2,hippRight_T3) %>% 
        gather("Side","Hipp",Left:Right) %>% 
        separate(Hipp,c("times1","times2","times3")) %>% 
        gather("times","Hipp",times1:times3) 

Une troisième approche en utilisant un seul appel à gather est:

library(dplyr) 
library(tidyr) 
long <- mydata %>% gather("Side","Hipp",-SID) %>% 
        mutate(times=paste0("times",sub(".*(\\d)$","\\1",Side)), 
          Side=sub("^hipp([A-z]+)_T.*","\\1",Side)) %>% 
        select(SID,Side,times,Hipp) 

Ici, la colonne de clé Side de gather contient des valeurs correspondant aux noms de colonne mydata d'origine. Nous utilisons deployer::mutate pour créer une copie de cette colonne nommée times. Ensuite, nous utilisons sub avec une certaine regex pour extraire le dernier chiffre pour les valeurs times et pour extraire soit ou Right pour les valeurs Side.

Réglage de la graine à 123, vos données sont:

set.seed(123) 
mydata <- data.frame(SID=sample(1:150,400, replace=TRUE), hippLeft_T1=sample(6000:8000,400,replace=TRUE), hippRight_T1=sample(6000:8000,400,replace=TRUE),hippLeft_T2=sample(6000:8000,400,replace=TRUE), hippRight_T2=sample(6000:8000,400,replace=TRUE),hippLeft_T3=sample(6000:8000,400,replace=TRUE), hippRight_T3=sample(6000:8000,400,replace=TRUE)) 
head(mydata) 
## SID hippLeft_T1 hippRight_T1 hippLeft_T2 hippRight_T2 hippLeft_T3 hippRight_T3 
##1 44  7973   6941  7718   7279  6319   7465 
##2 119  6274   6732  7775   6249  6289   7220 
##3 62  7811   6242  6978   6510  6298   6448 
##4 133  7153   6094  7436   7641  7029   7833 
##5 142  6791   6525  6973   7608  6986   7606 
##6 7  6900   7938  7978   6091  7233   6625 

Le résultat en utilisant la deuxième ou troisième approche est:

print(long) 
##  SID Side times Hipp 
## 1 44 Left times1 7973 
## 2 119 Left times1 6274 
## 3 62 Left times1 7811 
## 4 133 Left times1 7153 
## 5 142 Left times1 6791 
## 6 7 Left times1 6900 
## ... 
## 401 44 Right times1 6941 
## 402 119 Right times1 6732 
## 403 62 Right times1 6242 
## 404 133 Right times1 6094 
## 405 142 Right times1 6525 
## 406 7 Right times1 7938 
## ... 
## 801 44 Left times2 7718 
## 802 119 Left times2 7775 
## 803 62 Left times2 6978 
## 804 133 Left times2 7436 
## 805 142 Left times2 6973 
## 806 7 Left times2 7978 
## ... 
##1201 44 Right times2 7279 
##1202 119 Right times2 6249 
##1203 62 Right times2 6510 
##1204 133 Right times2 7641 
##1205 142 Right times2 7608 
##1206 7 Right times2 6091 
## ... 
##1601 44 Left times3 6319 
##1602 119 Left times3 6289 
##1603 62 Left times3 6298 
##1604 133 Left times3 7029 
##1605 142 Left times3 6986 
##1606 7 Left times3 7233 
## ... 
##2001 44 Right times3 7465 
##2002 119 Right times3 7220 
##2003 62 Right times3 6448 
##2004 133 Right times3 7833 
##2005 142 Right times3 7606 
##2006 7 Right times3 6625 
+0

Quelle colonne est le 'level' dans votre' mydata'? – aichao

+0

Merci! C'est exactement ce que la réorganisation me donnerait, mais je veux aussi ajouter un niveau pour le côté (gauche/droite), pas seulement le temps. J'ai donc un design imbriqué. Comment je reçois ça? – user6121484

+0

@ user6121484: essayez l'édition. Le résultat n'est pas ordonné exactement comme vous le souhaitez, mais le format long est ce que vous voulez. – aichao