Soy nuevo en dplyr y tratando de hacer la siguiente transformación sin suerte. He buscado en internet y he encontrado ejemplos para hacer lo mismo en ddply pero me gustaría utilizar dplyr.

Tengo los siguientes datos:

   month   type  count
1  Feb-14  bbb   341
2  Feb-14  ccc   527
3  Feb-14  aaa  2674
4  Mar-14  bbb   811
5  Mar-14  ccc  1045
6  Mar-14  aaa  4417
7  Apr-14  bbb  1178
8  Apr-14  ccc  1192
9  Apr-14  aaa  4793
10 May-14  bbb   916
..    ...  ...   ...

Quiero usar dplyr para calcular el porcentaje de cada tipo (aaa, bbb, ccc) en un mes, es decir, el nivel de

   month   type  count  per
1  Feb-14  bbb   341    9.6%
2  Feb-14  ccc   527    14.87%
3  Feb-14  aaa  2674    ..
..    ...  ...   ...

He intentado

data %>%
  group_by(month, type) %>%
  summarise(count / sum(count))

Esto le da un 1 como cada valor. ¿Cómo puedo realizar la suma(recuento) suma de todos los tipos en el mes?

InformationsquelleAutor KC. | 2015-04-09

2 Comentarios

  1. 52

    Intentar

    library(dplyr)
    data %>%
        group_by(month) %>%
        mutate(countT= sum(count)) %>%
        group_by(type, add=TRUE) %>%
        mutate(per=paste0(round(100*count/countT,2),'%'))

    También podríamos utilizar left_join después de resumir la sum(count) por el ‘mes’

    O una opción con data.table.

     library(data.table)
     setkey(setDT(data), month)[data[, list(count=sum(count)), month], 
                   per:= paste0(round(100*count/i.count,2), '%')][]
  2. 34

    Y con un poco menos código:

    df <- data.frame(month=c("Feb-14", "Feb-14", "Feb-14", "Mar-14", "Mar-14", "Mar-14", "Apr-14", "Apr-14", "Apr-14", "May-14"),
                 type=c("bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb"),
                 count=c(341, 527, 2674, 811, 1045, 4417, 1178, 1192, 4793, 916))
    
    
    library(dplyr)
    
    df %>% group_by(month) %>% 
           mutate(per=paste0(round(count/sum(count)*100, 2), "%")) %>% 
           ungroup

    Ya que desea que «dejar» el marco de datos virgen que no se debe usar summarise, mutate será suficiente.

Dejar respuesta

Please enter your comment!
Please enter your name here