Tengo problemas para reorganizar el siguiente marco de datos:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Quiero remodelarlo para que cada variable única de "nombre" sea un nombre de fila, con los "valores" como observaciones a lo largo de esa fila y los "números" como colnames. Algo así como esto:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Lo he visto melty castalgunas otras cosas, pero ninguna parece hacer el trabajo.

Respuestas:
Usando la
reshapefunción:fuente
reshapeviene constats. ¡Sin mencionar que es más rápido! =)reshapees un excelente ejemplo para una horrible función API. Está muy cerca de inútil.reshapecomentarios y nombres de argumentos similares no son tan útiles. Sin embargo, he descubierto que, de largo a ancho, debe proporcionardata =su data.frame,idvar= la variable que identifica sus grupos,v.names= las variables que se convertirán en columnas múltiples en formato ancho,timevar= la variable que contiene los valores que se agregarán av.namesen formato anchodirection = wide, ysep = "_". ¿Bastante claro? ;)El nuevo
tidyrpaquete (en 2014) también hace esto simplemente, congather()/spread()siendo los términos paramelt/cast.Editar: Ahora, en 2019, tidyr v 1.0 ha puesto en marcha y conjunto
spreadygatheren un camino de desaprobación, prefiriendo en su lugarpivot_widerypivot_longer, donde puede encontrar descrito en esta respuesta . Siga leyendo si desea un breve vistazo a la breve vida despread/gather.De github ,
fuente
tidyryreshape2. Proporciona buenos ejemplos y explicaciones.Puede hacer esto con la
reshape()función, o con las funcionesmelt()/cast()en el paquete de remodelación. Para la segunda opción, el código de ejemplo esO usando
reshape2fuente
castodcastno funcionará bien si no tiene una columna clara de "valor". Intentadat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)y no obtendrás lo que esperas. Debe anotar explícitamente elvalue/value.var-cast(dat, id ~ index, value="blah")ydcast(dat, id ~ index, value.var="blah")por ejemplo.Otra opción si el rendimiento es una preocupación es usar
data.tablela extensión dereshape2las funciones melt & dcast de( Referencia: remodelación eficiente usando data.tables )
Y, a partir de data.table v1.9.6 podemos lanzar en múltiples columnas
fuente
data.tableenfoque es el mejor! muy eficiente ... ¡verás la diferencia cuandonamehay una combinación de 30-40 columnas!Usando su marco de datos de ejemplo, podríamos:
fuente
Otras dos opciones:
Paquete base:
sqldfpaquete:fuente
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)Usando la
aggregatefunción base R :fuente
Con la versión de desarrollo de
tidyr‘0.8.3.9000’, haypivot_widerypivot_longerque se generaliza para hacer la remodelación (largo -> ancho, ancho -> largo, respectivamente) de 1 a varias columnas. Usando los datos del OP-una columna larga -> ancha
-> creó otra columna para mostrar la funcionalidad
fuente
La
reshapefunción base funciona perfectamente bien:Dónde
idvares la columna de clases que separa las filastimevares la columna de clases para emitirv.nameses la columna que contiene valores numéricosdirectionespecifica formato ancho o largosepargumento opcional es el separador utilizado entretimevarlos nombres de clase yv.namesen la salidadata.frame.Si no
idvarexiste, cree uno antes de usar lareshape()función:¡Solo recuerda que
idvares obligatorio! La partetimevaryv.nameses fácil. La salida de esta función es más predecible que algunas de las otras, ya que todo está explícitamente definido.fuente
Hay nueva muy potente paquete de datos científicos genio en Win-vectorial (gente que hizo
vtreat,seplyryreplyr) se llamacdata. Implementa los principios de "datos coordinados" descritos en este documento y también en esta publicación de blog . La idea es que, independientemente de cómo organice sus datos, debería ser posible identificar puntos de datos individuales utilizando un sistema de "coordenadas de datos". Aquí hay un extracto de la reciente publicación de blog de John Mount:Primero construiremos la tabla de control (vea la publicación del blog para más detalles) y luego realizaremos el movimiento de datos de filas a columnas.
fuente
mucho más fácil!
si desea volver de ancho a largo, solo cambie Ancho a Largo, y no cambie los objetos.
fuente