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 melt
y cast
algunas otras cosas, pero ninguna parece hacer el trabajo.
Respuestas:
Usando la
reshape
función:fuente
reshape
viene constats
. ¡Sin mencionar que es más rápido! =)reshape
es un excelente ejemplo para una horrible función API. Está muy cerca de inútil.reshape
comentarios 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.names
en formato anchodirection = wide
, ysep = "_"
. ¿Bastante claro? ;)El nuevo
tidyr
paquete (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
spread
ygather
en un camino de desaprobación, prefiriendo en su lugarpivot_wider
ypivot_longer
, donde puede encontrar descrito en esta respuesta . Siga leyendo si desea un breve vistazo a la breve vida despread/gather
.De github ,
fuente
tidyr
yreshape2
. 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
reshape2
fuente
cast
odcast
no 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.table
la extensión dereshape2
las 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.table
enfoque es el mejor! muy eficiente ... ¡verás la diferencia cuandoname
hay una combinación de 30-40 columnas!Usando su marco de datos de ejemplo, podríamos:
fuente
Otras dos opciones:
Paquete base:
sqldf
paquete: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
aggregate
función base R :fuente
Con la versión de desarrollo de
tidyr
‘0.8.3.9000’
, haypivot_wider
ypivot_longer
que 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
reshape
función base funciona perfectamente bien:Dónde
idvar
es la columna de clases que separa las filastimevar
es la columna de clases para emitirv.names
es la columna que contiene valores numéricosdirection
especifica formato ancho o largosep
argumento opcional es el separador utilizado entretimevar
los nombres de clase yv.names
en la salidadata.frame
.Si no
idvar
existe, cree uno antes de usar lareshape()
función:¡Solo recuerda que
idvar
es obligatorio! La partetimevar
yv.names
es 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
,seplyr
yreplyr
) 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