Forma fácil de convertir formato largo a ancho con conteos

Tengo el siguiente conjunto de datos:

sample.data <- data.frame(Step = c(1,2,3,4,1,2,1,2,3,1,1), Case = c(1,1,1,1,2,2,3,3,3,4,5), Decision = c("Referred","Referred","Referred","Approved","Referred","Declined","Referred","Referred","Declined","Approved","Declined")) sample.data Step Case Decision 1 1 1 Referred 2 2 1 Referred 3 3 1 Referred 4 4 1 Approved 5 1 2 Referred 6 2 2 Declined 7 1 3 Referred 8 2 3 Referred 9 3 3 Declined 10 1 4 Approved 11 1 5 Declined 

¿Es posible en R traducir esto en un formato de tabla amplia, con las decisiones en el encabezado y el valor de cada celda como el recuento de la ocurrencia, por ejemplo:

 Case Referred Approved Declined 1 3 1 0 2 1 0 1 3 2 0 1 4 0 1 0 5 0 0 1 

    Puede lograr esto con una simple statement table() . Puede jugar con los niveles de factores de configuración para obtener sus respuestas de la manera que desee.

     sample.data$Decision < - factor(x = sample.data$Decision, levels = c("Referred","Approved","Declined")) table(Case = sample.data$Case,sample.data$Decision) Case Referred Approved Declined 1 3 1 0 2 1 0 1 3 2 0 1 4 0 1 0 5 0 0 1 

    El parámetro de agregación en la función dcast del dcast de reshape2 predeterminada en la length (= conteo). En el data.table dcast se implementa una versión mejorada de la función dcast . Entonces en tu caso esto sería:

     library('reshape2') # or library('data.table') newdf < - dcast(sample.data, Case ~ Decision) 

    o con el uso de los parámetros explícitamente:

     newdf < - dcast(sample.data, Case ~ Decision, value.var = "Decision", fun.aggregate = length) 

    Esto da el siguiente dataframe:

     > newdf Case Approved Declined Referred 1 1 1 0 3 2 2 0 1 1 3 3 0 1 2 4 4 1 0 0 5 5 0 1 0 

    Si no especificas una función de agregación, obtienes una advertencia que te dice que dcast usa la lenght como valor predeterminado.

    Aquí hay un enfoque dplyr + tidyr :

     if (!require("pacman")) install.packages("pacman") pacman::p_load(dplyr, tidyr) sample.data %>% count(Case, Decision) %>% spread(Decision, n, fill = 0) ## Case Approved Declined Referred ## (dbl) (dbl) (dbl) (dbl) ## 1 1 1 0 3 ## 2 2 0 1 1 ## 3 3 0 1 2 ## 4 4 1 0 0 ## 5 5 0 1 0 

    Podemos usar la base R xtabs

     xtabs(Step~Case+Decision, transform(sample.data, Step=1)) # Decision # Case Approved Declined Referred # 1 1 0 3 # 2 0 1 1 # 3 0 1 2 # 4 1 0 0 # 5 0 1 0