Alternativas a las estadísticas :: remodelar

Las funciones de fundido / fundido en el paquete de remodelación son geniales, pero no estoy seguro de si hay una manera simple de aplicarlas cuando las variables medidas son de diferentes tipos. Por ejemplo, aquí hay un fragmento de datos donde cada MD proporciona el género y el peso de tres pacientes:

ID PT1 WT1 PT2 WT2 PT3 WT3
1  "M" 170 "M" 175 "F" 145
...

donde el objetivo es remodelar para que cada fila sea un paciente:

ID PTNUM GENDER WEIGHT
1    1     "M"    170
1    2     "M"    175
1    3     "F"    145
...

Utilizando la función de remodelación en el paquete de estadísticas es una opción de la que estoy al tanto, pero estoy publicando aquí con la esperanza de que los usuarios de R más experimentados que yo publiquen otros métodos, con suerte mejores. ¡Muchas gracias

-

@ Vincent Zoonekynd:

e gustó mucho tu ejemplo, así que lo generalicé a varias variables.

# Sample data
n <- 5
d <- data.frame(
  id = 1:n,
  p1 = sample(c("M","F"),n,replace=TRUE),
  q1 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w1 = round(runif(n,100,200)),
  y1 = round(runif(n,100,200)),
  p2 = sample(c("M","F"),n,replace=TRUE),
  q2 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w2 = round(runif(n,100,200)),
  y2 = round(runif(n,100,200)),
  p3 = sample(c("M","F"),n,replace=TRUE),
  q3 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w3 = round(runif(n,100,200)),
  y3 = round(runif(n,100,200))
  )
# Reshape the data.frame, one variable at a time
library(reshape)
d1 <- melt(d, id.vars="id", measure.vars=c("p1","p2","p3","q1","q2","q3"))
d2 <- melt(d, id.vars="id", measure.vars=c("w1","w2","w3","y1","y2","y3"))
d1 = cbind(d1,colsplit(d1$variable,names=c("var","ptnum")))
d2 = cbind(d2,colsplit(d2$variable,names=c("var","ptnum")))
d1$variable = NULL
d2$variable = NULL
d1c = cast(d1,...~var)
d2c = cast(d2,...~var)
# Join the two data.frames
d3 = merge(d1c, d2c, by=c("id","ptnum"), all=TRUE)

-

Pensamientos finales: mi motivación para esta pregunta fue aprender sobre alternativas al paquete de remodelación que no sea la función stats :: reshape. Por el momento, he llegado a las siguientes conclusiones:

Stick to stats :: remodelar cuando puedas. Siempre que recuerde utilizar una lista en lugar de un vector simple para el argumento "variable", no se meterá en problemas. Para conjuntos de datos más pequeños (unos pocos miles de casos de pacientes con menos de 200 variables en total es lo que estaba tratando esta vez), la velocidad más baja de esta función vale la simplicidad del códig

Para usar el enfoque de fundición / fusión en el paquete de remodelación (o remodelación2) de Hadley Wickham, debe dividir sus variables en dos conjuntos, uno compuesto por variables numéricas y otro por variables de caracteres. Cuando su conjunto de datos es lo suficientemente grande como para que encuentre stats :: reshape insoportable, imagino que el paso adicional de dividir sus variables en dos conjuntos no parecerá tan malo.

Respuestas a la pregunta(4)

Su respuesta a la pregunta