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) con dcast(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 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow