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ónX
Sé 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 losX
son seguidos primero porY
o 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.