R Language
Pivot y unpivot con data.table
Buscar..
Sintaxis
- Derretir con
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
-
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
condcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
Parámetros
Parámetro | Detalles |
---|---|
id.vars | decirle a melt qué columnas retener |
nombre de la variable | Dile a melt cómo llamar a la columna con etiquetas de categoría. |
valor.nombre | le dice a melt cómo llamar a la columna que tiene valores asociados con las etiquetas de categoría |
valor.var | dcast a dcast dónde encontrar los valores para convertir en columnas. |
fórmula | dcast a dcast qué columnas deben retenerse para formar un identificador único de registro (LHS) y cuál contiene las etiquetas de categoría (RHS) |
fun.aggregate | Especifique la función que se utilizará cuando la operación de conversión genera una lista de valores en cada celda. |
Observaciones
Gran parte de lo que conlleva el acondicionamiento de datos para construir modelos o visualizaciones se puede lograr con data.table
. En comparación con otras opciones, data.table
ofrece ventajas de velocidad y flexibilidad.
Datos tabulares de pivote y no pivote con data.table - I
Convertir de forma ancha a forma larga
Cargar data USArrests
desde datasets
de datasets
.
data("USArrests")
head(USArrests)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
Use ?USArrests
para obtener más información. En primer lugar, convertir a data.table
. Los nombres de estados son nombres de fila en el data.frame
original.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
Se trata de datos en forma amplia. Tiene una columna para cada variable. Los datos también se pueden almacenar en forma larga sin pérdida de información. La forma larga tiene una columna que almacena los nombres de las variables. Luego, tiene otra columna para los valores variables. La forma larga de USArrests
parece ser así.
State Crime Rate
1: Alabama Murder 13.2
2: Alaska Murder 10.0
3: Arizona Murder 8.1
4: Arkansas Murder 8.8
5: California Murder 9.0
---
196: Virginia Rape 20.7
197: Washington Rape 26.2
198: West Virginia Rape 9.3
199: Wisconsin Rape 10.8
200: Wyoming Rape 15.6
Usamos la función de melt
para cambiar de forma ancha a forma larga.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
De forma predeterminada, melt
trata todas las columnas con datos numéricos como variables con valores. En Estados USArrests
, la variable UrbanPop
representa el porcentaje de población urbana de un estado. Es diferente de los otros variabes, Murder
, Assault
y Rape
, que son crímenes violentos reportados por cada 100,000 personas. Supongamos que queremos conservar la columna UrbanPop
. Esto lo id.vars
configurando id.vars
siguiente manera.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Tenga en cuenta que hemos especificado los nombres de la columna que contienen nombres de categoría (Asesinato, Asalto, etc.) con variable.name
y la columna que contiene los valores con value.name
. Nuestros datos se ven así.
State UrbanPop Crime Rate
1: Alabama 58 Murder 13.2
2: Alaska 48 Murder 10.0
3: Arizona 80 Murder 8.1
4: Arkansas 50 Murder 8.8
5: California 91 Murder 9.0
Generar resúmenes con un enfoque de estilo dividir-aplicar-combinar es una brisa. Por ejemplo, ¿para resumir los crímenes violentos por estado?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
Esto da:
State ViolentCrime
1: Alabama 270.4
2: Alaska 317.5
3: Arizona 333.1
4: Arkansas 218.3
5: California 325.6
6: Colorado 250.6
Datos tabulares de pivote y no pivote con data.table - II
Convertir de forma larga a forma ancha
Para recuperar datos del ejemplo anterior, use dcast
así.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Esto da los datos en la forma amplia original.
State UrbanPop Murder Assault Rape
1: Alabama 58 13.2 236 21.2
2: Alaska 48 10.0 263 44.5
3: Arizona 80 8.1 294 31.0
4: Arkansas 50 8.8 190 19.5
5: California 91 9.0 276 40.6
Aquí, la notación de fórmula se utiliza para especificar las columnas que forman un identificador único de registro (LHS) y la columna que contiene etiquetas de categoría para los nuevos nombres de columna (RHS). ¿Qué columna usar para los valores numéricos? De forma predeterminada, dcast
utiliza la primera columna con valores numéricos que quedan de la especificación de la fórmula. Para hacerlo explícito, use el parámetro value.var
con el nombre de la columna.
Cuando la operación produce una lista de valores en cada celda, dcast
proporciona un método fun.aggregate
para manejar la situación. Digamos que me interesan los estados con una población urbana similar al investigar las tasas de delincuencia. Añado una columna Decile
con información computada.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Ahora, el lanzamiento de Decile ~ Crime
produce múltiples valores por celda. Puedo usar fun.aggregate
para determinar cómo se manejan estos. Tanto el texto como los valores numéricos se pueden manejar de esta manera.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Esto da:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
Esto da:
State UrbanPop Crime Rate Decile
1: Alabama 58 Murder 13.2 4D
2: Alaska 48 Murder 10.0 2D
3: Arizona 80 Murder 8.1 8D
4: Arkansas 50 Murder 8.8 2D
5: California 91 Murder 9.0 10D
Hay múltiples estados en cada decil de la poblacion urbana. Use fun.aggregate
para especificar cómo deben manejarse estos.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Esto suma los datos de los estados similares, dando lo siguiente.
Decile Murder Assault Rape
1: 1D 39.4 808 62.6
2: 2D 35.3 815 94.3
3: 3D 22.6 451 67.7
4: 4D 54.9 898 106.0
5: 5D 42.4 758 107.6