Convierta datos de formato largo a formato ancho con múltiples columnas de medida

Estoy teniendo problemas para encontrar la forma más elegante y flexible de cambiar datos de formato largo a formato ancho cuando tengo más de una variable de medida que quiero llevar.

Por ejemplo, aquí hay un simple marco de datos en formato largo.ID es el sujeto,TIME es una variable de tiempo, yX yY son medidas hechas deID aTIME:

> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)
> my.df

   ID TIME  X  Y
1   A    1  1 16
2   B    1  2 17
3   C    1  3 18
4   A    2  4 19
5   B    2  5 20
6   C    2  6 21
7   A    3  7 22
8   B    3  8 23
9   C    3  9 24
10  A    4 10 25
11  B    4 11 26
12  C    4 12 27
13  A    5 13 28
14  B    5 14 29
15  C    5 15 30

Si solo quisiera convertir los valores deTIME en encabezados de columna que contienen la inclusiónXSé que puedo usarcast() desde elreshape paquete (odcast() desdereshape2):

> cast(my.df, ID ~ TIME, value="X")
  ID 1 2 3  4  5
1  A 1 4 7 10 13
2  B 2 5 8 11 14
3  C 3 6 9 12 15

Pero lo que realmente quiero hacer es traer tambiénY como otra variable de medida, y haga que los nombres de las columnas reflejen tanto el nombre de la variable de medida como el valor de tiempo:

  ID X_1 X_2 X_3  X_4 X_5 Y_1 Y_2 Y_3 Y_4 Y_5
1  A   1   4   7   10  13  16  19  22  25  28
2  B   2   5   8   11  14  17  20  23  26  29
3  C   3   6   9   12  15  18  21  24  27  30

(FWIW, realmente no me importa si todos losXson seguidos primero porYo si están intercalados comoX_1, Y_1, X_2, Y_2, etc.)

Puedo acercarme a esto poremitir-servir los datos largos dos veces y fusionar los resultados, aunque los nombres de las columnas necesitan algo de trabajo, y necesitaría modificarlos si fuera necesario agregar una tercera o cuarta variable además deX yY:

merge(
cast(my.df, ID ~ TIME, value="X"),
cast(my.df, ID ~ TIME, value="Y"),
by="ID", suffixes=c("_X","_Y")
)

Parece una combinación de funciones enreshape2 y / oplyr Debería poder hacer esto de manera más elegante que mi intento, así como manejar las variables de medida de manera más limpia. Algo comocast(my.df, ID ~ TIME, value=c("X","Y")), lo cual no es válido. Pero no he podido averiguarlo.

Respuestas a la pregunta(4)

Su respuesta a la pregunta