2011-11-19 19 views
11

Sé que esto se ha preguntado varias veces aquí bajo la rúbrica de "largo a ancho", pero me he encontrado con una situación en la que tengo dos variables de valor que son medidas repetidas.Largo a ancho con dos medidas repetidas

  id sex time  score1 score2 
1 subject 1 m Time1 -0.20926263 0.2499310 
2 subject 2 m Time1 0.17147511 3.2708905 
3 subject 3 m Time1 -0.82619584 0.5993917 
4 subject 4 f Time1 -0.95568823 4.4729726 
5 subject 5 f Time1 -2.29939525 8.0101254 
6 subject 1 m Time2 -0.37914702 3.6387589 
7 subject 2 m Time2 0.26759909 4.9027533 
8 subject 3 m Time2 0.07727621 2.1848642 
9 subject 4 f Time2 -0.08613439 5.8747074 
10 subject 5 f Time2 -0.02743044 4.3963938 
11 subject 1 m Time3 0.07176053 3.7959496 
12 subject 2 m Time3 0.46463917 5.2494579 
13 subject 3 m Time3 -0.68764512 2.2639503 
14 subject 4 f Time3 -0.56670061 2.3361909 
15 subject 5 f Time3 1.70731774 5.8345116 

Forma rápida de reproducir el marco de datos (DF).

DF<-data.frame(id=rep(paste("subject", 1:5, sep=" "), 3),    
       sex=rep(c("m","m","m","f","f"), 3),      
       time=c(rep("Time1",5), rep("Time2",5), rep("Time3",5)), 
       score1=rnorm(15), score2=abs(rnorm(15)*4))    

puedo resolver el problema de largo a ancho para dos variables medidas repetidas medidos utilizando la función reshape de base, pero yo estaba esperando una respuesta plyr o reshape2/1, ya que estos paquetes son generalmente mucho más intuitivo para mí. Si tiene otras soluciones, siga adelante y bríndelas, ya que el aprendizaje sería excelente.

solución de la base:

wide <- reshape(DF, v.names=c("score1", "score2"), idvar="id",   
       timevar="time", direction="wide")      
wide 
+1

? No veo para qué fue el voto cercano ("fuera del tema") ...? –

+1

Ben lo clavó con una nueva forma y con tan poco código. Estoy muy abierto a otros métodos (no estoy seguro si/cómo hacer esto con data.table, etc.) –

Respuesta

12

creo que esto lo hará:

library(reshape) 
m <- melt(DF) 

más simple, pero el tiempo y la puntuación son en el orden inverso de su ejemplo (en caso de que importa)

cast(m,id+sex~...) 

O más explícitamente:

cast(m,id+sex~variable+time) 

puede cortar esta a una sola línea:

recast(DF,id+sex~...) 

Si lo desea, puede utilizar la nueva reshape2 paquete en lugar de reshape, en sustitución de cast con dcast (la versión de recast incluido en reshape2 doesn 'dar el resultado deseado.)

+0

Perfection. Gracias por la oportunidad de aprendizaje. –

2

La respuesta de Ben es excelente teniendo en cuenta la fecha en que se hizo esta pregunta. Sin embargo, debe tenerse en cuenta que la función dcast incluida en las versiones más recientes de "data.table" puede manejar problemas como este sin tener que primero los datos melt. Como tal, sería un enfoque más eficiente de usar.

library(data.table) 
dcast(as.data.table(DF), id + sex ~ time, value.var = c("score1", "score2")) 
##   id sex score1_Time1 score1_Time2 score1_Time3 score2_Time1 score2_Time2 score2_Time3 
## 1: subject 1 m 0.78213630 -0.1557955 -0.10278773 1.5771598  1.013447 1.4583278 
## 2: subject 2 m 0.07456498 -1.4707524 0.38767161 0.2372536  2.787854 3.0741317 
## 3: subject 3 m -1.98935170 -0.4781501 -0.05380504 4.4001015  2.226653 0.4493848 
## 4: subject 4 f 0.61982575 0.4179416 -1.37705956 3.0527030  2.755023 3.5244309 
## 5: subject 5 f -0.05612874 1.3586796 -0.41499456 0.6580944  2.829981 1.5924235 
Cuestiones relacionadas