TransWikia.com

spread y nombre de filas y columnas

Stack Overflow en español Asked by iav on December 9, 2020

tengo un dataframe (df) que contiene fechas de nacimiento entre otras muchas cosas. Quiero tener una relación de totales por edad de manera que las columnas sean cada uno de las edades (por año) y la fila sea el total de elementos que tienen esa edad.

La edad la calculo sobre la marcha con difftime, y la uso para agrupar y filtrar. El resultado, antes de spread() es una columna edad y una columna cuantos con los contadores correctos.

# A tibble: 16 x 2
    edat quants
   <dbl>  <int>
 1     2  10509
 2     3  13461
 3     4  13488

Pero, al pasar la información a spread me genera las edades como nombres de columna y los totales para cada columna pero he perdido los nombres de las filas:

`2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`  `11`  `12`  `13`  `14`  `15`  `16`  `17`
10509 13461 13488 13843 13717 13577 13786 13986 13870 13805 14342 13801 14106 13792 13948 13714

Quiero poder tener algo parecido a:

Edad    `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`  `11`  `12`  `13`  `14`  `15`  `16`  
Total  10509 13461 13488 13843 13717 13577 13786 13986 13870 13805 14342 13801 14106 13792 13948 

Probablemente sea una tontería pero no sé cómo hacerlo. Soy nuevo en R

edad_2_17 <- df %>% 
  mutate(edad = round(as.numeric(difftime(Sys.Date(),df$FECHANAC, unit = "days"))/(365.25),0)) %>%
  group_by(edad) %>% 
  summarise (cuantos = n()) %>%
  filter(between(edad, 2.0,17.0)) %>%
  spread(edad,cuantos)

Saludos

One Answer

Entiendo que lo que buscas, más que un spread() es una transposición, que puedes implementar con la función t():

tribble(
  ~edad, ~cuantos,
     2,  10509,
     3,  13461,
     4,  13488
) -> df

df %>% 
  t() %>%                            # Transponemos filas x columnas -> matrix
  as_tibble(rownames = "row_names")  # matrix -> df (rownames a columna)

# A tibble: 2 x 4
  row_names    V1    V2    V3
  <chr>     <dbl> <dbl> <dbl>
1 edad          2     3     4
2 cuantos   10509 13461 13488

Answered by Patricio Moracho on December 9, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP