Las funciones de fusión/fundido en el paquete de remodelación son geniales, pero no estoy seguro de si hay una forma sencilla de aplicarlas cuando las variables medidas son de diferentes tipos. Por ejemplo, aquí es un fragmento de datos donde cada MD proporciona el sexo y el peso de los tres pacientes:Alternativas a stats :: reshape
ID PT1 WT1 PT2 WT2 PT3 WT3
1 "M" 170 "M" 175 "F" 145
...
donde el objetivo es remodelar de manera que cada fila es un paciente:
ID PTNUM GENDER WEIGHT
1 1 "M" 170
1 2 "M" 175
1 3 "F" 145
...
Utilizando el La función de remodelación en el paquete de estadísticas es una opción de la que tengo conocimiento, pero la estoy publicando aquí con la esperanza de que los usuarios de R con más experiencia que yo publiquen otros métodos, con suerte mejores. ¡Muchas gracias!
-
@Vincent Zoonekynd:
me gusta tu ejemplo mucho, por lo que la generalizó a múltiples 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)
-
Consideraciones finales: Mi motivación para esta pregunta fue conocer alternativas al paquete de cambio de forma distinta las estadísticas :: función de formar de nuevo. Por el momento, he llegado a las siguientes conclusiones:
Adhiérase a las estadísticas :: remodele cuando pueda. Siempre que recuerde usar una lista en lugar de un vector simple para el argumento "variable", se mantendrá alejado de 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ódigo.
Para usar el enfoque fundido/fundido en el paquete de remodelación (o reshape2) de Hadley Wickham, debe dividir las variables en dos conjuntos, uno compuesto por variables numéricas y otro de variables de caracteres. Cuando tu conjunto de datos es lo suficientemente grande como para que encuentres stats :: remodelar insoportable, imagino que el paso adicional de dividir tus variables en dos conjuntos no parecerá tan malo.
¿Mejor en qué sentido? remodelar está diseñado para tareas como esta, ¿por qué no usarlo? – Fojtasek
Reshape funciona bien siempre que se recuerde usar la forma canónica del argumento variable (una lista): [link] (http://www.mail-archive.com/[email protected]/msg160715 .html) Con R, estoy constantemente sorprendido por la existencia de alternativas que no conocía, así que pensé que alguien publicaría otros enfoques. Un ejemplo de la definición de "mejor" sería la velocidad: en mi experiencia subjetivamente reconocida, el lanzamiento/fusión parece más rápido que la configuración incorporada. –
No me di cuenta de esto, gracias. Ahora he cambiado la biblioteca de reshape2 a remodelar.Todavía puede usar reshape2 si lo desea: tendrá que agregar el argumento de patrón con un valor de "" a la llamada colsplit(). –