Agrupar por y mutar condicionalmente + contar.
Tengo el siguiente marco de datos de ejemplo (el original tiene más de 200,000 filas):
df <- tribble(~ id, ~ birth_year,
1, 2015,
1, 2015,
1, 2016,
2, 2008,
2, 2010,
3, 2010,
3, 2014,
3, 2014,
3, 2014,
4, 2010,
4, 2011,
4, 2012,
4, 2013)
Quiero agrupar por id y contar cuántas veces se repite un año de nacimiento con el id. Idealmente, obtener lo siguiente:
df_wanted <- tribble(~ id, ~ birth_year, ~ n,
1, 2015, 2,
1, 2015, 2,
1, 2016, 2,
2, 2008, 0,
2, 2010, 0,
3, 2010, 3,
3, 2014, 3,
3, 2014, 3,
3, 2014, 3,
4, 2010, 0,
4, 2011, 0,
4, 2012, 0,
4, 2013, 0)
¿Alguna sugerencia? Me encontré con el recuento condicional de valores específicos, pero no con casos repetidos como en mi ejemplo.
davy.ai
Para lograr la salida deseada, podemos usar las funciones
group_by
ymutate
del paquetedplyr
junto con la funcióncount
del paquetetidyverse
. Aquí está el código:{r}
library(dplyr)
library(tidyverse)
df_wanted <- df %>%
group_by(id, birth_year) %>%
count() %>%
ungroup() %>%
right_join(df, by = c("id", "birth_year")) %>%
replace_na(list(n = 0))
Desglosemos esto paso a paso:
df
porid
ybirth_year
utilizando la funcióngroup_by
.id
ybirth_year
mediante la funcióncount
.ungroup
.df
con el marco de datos resumido utilizando las variablesid
ybirth_year
mediante la funciónright_join
. Esto asegura que se retengan todas las filas del marco de datos original.replace_na
.El marco de datos resultante
df_wanted
tendrá la salida deseada como se muestra en el ejemplo.