versiones guia español descargar actualizar r reshape reshape2

guia - Remodelando un marco de datos con más de una variable de medida



qgis manual (3)

Así es como puedes hacer esto con reshape() , desde la base R:

df2 <- reshape(df, direction="long", idvar = 1:2, varying = list(c(3,5), c(4,6)), v.names = c("p1", "p2"), times = c("quiz1", "quiz2")) ## Checking the output rbind(head(df2, 3), tail(df2, 3)) # student month time p1 p2 # 1.1.quiz1 1 1 quiz1 20.0 30.0 # 1.2.quiz1 1 2 quiz1 20.1 30.1 # 1.3.quiz1 1 3 quiz1 20.2 30.2 # 2.3.quiz2 2 3 quiz2 80.7 90.7 # 2.4.quiz2 2 4 quiz2 80.8 90.8 # 2.5.quiz2 2 5 quiz2 80.9 90.9

También puede usar nombres de columna (en lugar de números de columna) para idvar y varying . Es más detallado, pero me parece una mejor práctica:

## The same operation as above, using just column *names* df2 <- reshape(df, direction="long", idvar=c("student", "month"), varying = list(c("quiz1p1", "quiz2p1"), c("quiz1p2", "quiz2p2")), v.names = c("p1", "p2"), times = c("quiz1", "quiz2"))

Estoy usando un marco de datos similar a este:

df<-data.frame(student=c(rep(1,5),rep(2,5)), month=c(1:5,1:5), quiz1p1=seq(20,20.9,0.1),quiz1p2=seq(30,30.9,0.1), quiz2p1=seq(80,80.9,0.1),quiz2p2=seq(90,90.9,0.1)) print(df) student month quiz1p1 quiz1p2 quiz2p1 quiz2p2 1 1 1 20.0 30.0 80.0 90.0 2 1 2 20.1 30.1 80.1 90.1 3 1 3 20.2 30.2 80.2 90.2 4 1 4 20.3 30.3 80.3 90.3 5 1 5 20.4 30.4 80.4 90.4 6 2 1 20.5 30.5 80.5 90.5 7 2 2 20.6 30.6 80.6 90.6 8 2 3 20.7 30.7 80.7 90.7 9 2 4 20.8 30.8 80.8 90.8 10 2 5 20.9 30.9 80.9 90.9

Describiendo las calificaciones recibidas por los estudiantes durante cinco meses, en dos pruebas divididas en dos partes cada una.

Necesito colocar las dos pruebas en filas separadas, de modo que cada estudiante de cada mes tenga dos filas, una para cada prueba y dos columnas, para cada parte de la prueba. Cuando derrito la mesa:

melt.data.frame(df, c("student", "month"))

También obtengo las dos partes del cuestionario en líneas separadas.

dcast(dfL,student+month~variable)

por supuesto, me devuelve al punto de partida, y no puedo encontrar la manera de volver a colocar la mesa en la forma requerida. ¿Hay alguna manera de hacer que la función de comando de fusión sea algo como:

melt.data.frame(df, measure.var1=c("quiz1p1","quiz2p1"), measure.var2=c("quiz1p2","quiz2p2"))


Creo que esto hace lo que quieres:

#Break variable into two columns, one for the quiz and one for the part of the quiz dfL <- transform(dfL, quiz = substr(variable, 1,5), part = substr(variable, 6,7)) #Adjust your dcast call: dcast(dfL, student + month + quiz ~ part) #----- student month quiz p1 p2 1 1 1 quiz1 20.0 30.0 2 1 1 quiz2 80.0 90.0 3 1 2 quiz1 20.1 30.1 ... 18 2 4 quiz2 80.8 90.8 19 2 5 quiz1 20.9 30.9 20 2 5 quiz2 80.9 90.9


Hace aproximadamente un año se question una question similar, en la que escribí la siguiente función:

melt.wide = function(data, id.vars, new.names) { require(reshape2) require(stringr) data.melt = melt(data, id.vars=id.vars) new.vars = data.frame(do.call( rbind, str_extract_all(data.melt$variable, "[0-9]+"))) names(new.vars) = new.names cbind(data.melt, new.vars) }

Puede utilizar la función para "fundir" sus datos de la siguiente manera:

dfL <-melt.wide(df, id.vars=1:2, new.names=c("Quiz", "Part")) head(dfL) # student month variable value Quiz Part # 1 1 1 quiz1p1 20.0 1 1 # 2 1 2 quiz1p1 20.1 1 1 # 3 1 3 quiz1p1 20.2 1 1 # 4 1 4 quiz1p1 20.3 1 1 # 5 1 5 quiz1p1 20.4 1 1 # 6 2 1 quiz1p1 20.5 1 1 tail(dfL) # student month variable value Quiz Part # 35 1 5 quiz2p2 90.4 2 2 # 36 2 1 quiz2p2 90.5 2 2 # 37 2 2 quiz2p2 90.6 2 2 # 38 2 3 quiz2p2 90.7 2 2 # 39 2 4 quiz2p2 90.8 2 2 # 40 2 5 quiz2p2 90.9 2 2

Una vez que los datos están en esta forma, puede usar mucho más fácilmente dcast() para obtener la forma que desee. Por ejemplo

head(dcast(dfL, student + month + Quiz ~ Part)) # student month Quiz 1 2 # 1 1 1 1 20.0 30.0 # 2 1 1 2 80.0 90.0 # 3 1 2 1 20.1 30.1 # 4 1 2 2 80.1 90.1 # 5 1 3 1 20.2 30.2 # 6 1 3 2 80.2 90.2