2011-10-19 16 views
45

que tienen enorme trama de datos de esta manera:Reorganizar trama de datos a una tabla, lo contrario de "fundir"

SN = c(1:100, 1:100, 1:100, 1:100) 
class = c(rep("A1", 100), rep("B2", 100), rep("C3", 100), rep("D4", 100)) # total 6000 levels 
myvar = rnorm(400) 
mydf = data.frame(SN, class, myvar) 

quiero "unmelt" a una mesa con cada nivel lo más sola columna y mivar de llenado:

SN   A1   B2   C3   D4  .............and so on for all 6000 

Como puedo lograr esto, sé que es una pregunta simple, pero no pude entenderlo.

+2

En el paquete 'reshape2' lo contrario de' melt' es 'cast' – Andrie

+0

gracias por las sugerencias, require (reshape2); acast (mydf, myvar ~ class) produjo el resultado – jon

+0

Ver respuesta más abajo para la sintaxis correcta. Es bastante natural después de usarlo un par de veces. Mucho mejor que el 'built-in' remodelado() '. –

Respuesta

47
> dcast(mydf, SN ~ class) 

    SN   A1   B2   C3   D4 
1 1 0.1461258 0.8325014 0.33562088 -0.07294576 
2 2 0.5964182 0.4593710 -0.23652803 -1.52539568 
3 3 2.0247742 -1.1235963 1.79875447 -1.87462227 
4 4 0.8184004 1.3486721 0.76076486 -1.18311991 
5 5 -0.6577212 0.3666741 -0.06057506 1.38825487 
6 6 0.1590443 0.2043661 0.08161778 0.10421797 
... 
+10

Nota: esto es de la biblioteca 'reshape2'. –

+2

También tenga en cuenta que la "mejor práctica" sería: dcast (mydf, SN ~ class, value.var = "myvar") – pallevillesen

+0

Um, ¿debería funcionar? 'iris_melt <- derretimiento (iris); dcast (iris_melt, especie ~ variable) '? Porque no es así. Da cuenta (una especie por tabla de medidas). – naught101

5
molten = melt(mydf , id.vars = c("SN" , "class") , measure.vars = "myvar") 
casted = dcast(molten , SN~class) 
1

de la base de R que podría hacerlo así ...

# get it sorted so that all you need to do is make a matrix out of it 
mydf <- mydf[order(mydf$class, mydf$SN),] 
# save the unique values of SN 
SNu <- unique(mydf$SN) 
# combine a matrix with SN 
mydfw <- data.frame(SNu, matrix(mydf$myvar, nrow = length(SNu))) 
# name your columns  
colnames(mydfw) <- c('SN', levels(mydf$class)) 

O, para una expresión más concisa utilizando agregada

aggregate(myvar~SN, mydf, 'c') 
# column names don't come out great 
colnames(mydfw) <- c('SN', levels(mydf$class)) 
+1

Eso supone que todas las combinaciones de niveles están presentes, lo que, en general, es una suposición peligrosa de realizar. – hadley

+0

Funciona para el ejemplo. Simplemente no te gusta el primero porque es muy rápido. :) Pero bromas aparte, pregunta, Hadley está en lo cierto, si no tienes una matriz completa, entonces esto no funcionará correctamente. Simplemente podría fusionarse con un diseño factorial completo utilizando expand.grid para los factores de interés. – John

1

Otro enfoque con split:

mydfSplit <- split(mydf[,-2], mydf$class, drop=TRUE) 

El resultado es una lista que se puede convertir fácilmente a una data.frame si los componentes tienen las mismas dimensiones (lo cual es cierto en este ejemplo):

mydf2 <- do.call(cbind, mydfSplit) 

El problema con esta solución es que los nombres de la resultado final necesita una limpieza. Sin embargo, para una información más general, esto puede ser útil si SN es diferente para cada clase.

Cuestiones relacionadas