Supongamos que tengo los siguientes datos:
data = tibble::tribble(
~id, ~year_1, ~year_2, ~cod_1, ~cod_2, ~cod_3, ~cod_4, ~var_x,
1, 0, 1, 5, 5, 3, 6, "x",
1, 0, 1, 3, 6, 14, 5, "x",
1, 0, 1, 2, 8, 5, 4, "x",
2, 1, 0, 10, 8, 2, 3, "x",
2, 1, 0, 3, 9, 1, 2, "x",
2, 1, 0, 1, 12, 0, 1, "x"
)
Me gustaría crear todos los productos posibles de la combinación de todas las columnas "año_" por todas las columnas "cod_". Me refiero a algo como esto:
data.new = data %>%
mutate(year_1_cod_1 = year_1 * cod_1) %>%
mutate(year_1_cod_2 = year_1 * cod_2) %>%
mutate(year_1_cod_3 = year_1 * cod_3) %>%
mutate(year_1_cod_4 = year_1 * cod_4) %>%
mutate(year_2_cod_1 = year_2 * cod_1) %>%
mutate(year_2_cod_2 = year_2 * cod_2) %>%
mutate(year_2_cod_3 = year_2 * cod_3) %>%
mutate(year_2_cod_4 = year_2 * cod_4)
Puedo obtener todas las combinaciones posibles usando:
year.var = colnames(data[, grepl("year", names(data))])
cod.var = colnames(data[, grepl("cod", names(data))])
com = crossing(year.var, cod.var)
> com
# A tibble: 8 x 2
year.var cod.var
<chr> <chr>
1 year_1 cod_1
2 year_1 cod_2
3 year_1 cod_3
4 year_1 cod_4
5 year_2 cod_1
6 year_2 cod_2
7 year_2 cod_3
8 year_2 cod_4
Podría usar un bucle for para mover sobre el marco de datos com
y crear cada nueva columna. Pero me gustaría hacer esto dentro del entorno dplyr::
. Creo que puedo usar purrr::
a mutate
sobre todas las combinaciones, pero no estoy seguro de cómo hacerlo.
De hecho, en mis datos reales tengo más de 1k combinaciones posibles (es decir, más de 1k variables para mutar).
2 respuestas
Puede usar map2
para recorrer la combinación en com
y usar transmute
para crear nuevas columnas al multiplicar esas columnas usando una evaluación no estándar y finalmente vincularla al marco de datos original.
library(dplyr)
library(purrr)
data %>%
bind_cols(map2_dfc(com$year.var, com$cod.var,
~data %>% transmute(!!paste(.x, .y, sep = "_") := !!sym(.x) * !!sym(.y))))
# A tibble: 6 x 16
# id year_1 year_2 cod_1 cod_2 cod_3 cod_4 var_x year_1_cod_1 year_1_cod_2
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
#1 1 0 1 5 5 3 6 x 0 0
#2 1 0 1 3 6 14 5 x 0 0
#3 1 0 1 2 8 5 4 x 0 0
#4 2 1 0 10 8 2 3 x 10 8
#5 2 1 0 3 9 1 2 x 3 9
#6 2 1 0 1 12 0 1 x 1 12
# … with 6 more variables: year_1_cod_3 <dbl>, year_1_cod_4 <dbl>,
# year_2_cod_1 <dbl>, year_2_cod_2 <dbl>, year_2_cod_3 <dbl>,
# year_2_cod_4 <dbl>
library(dplyr)
library(tidyr)
data %>%
pivot_longer(starts_with("year"), names_to = "year", values_to = "year_val") %>%
pivot_longer(starts_with("cod"), names_to = "cod", values_to = "cod_val") %>%
mutate(year_cod = paste(year, cod, sep = "_"),
val = year_val * cod_val) %>%
pivot_wider(
id_cols = c(id, var_x),
names_from = year_cod,
values_from = val,
values_fn = list(val = list)
) %>%
unnest(cols = c(-id, -var_x))
#> # A tibble: 6 x 10
#> id var_x year_1_cod_1 year_1_cod_2 year_1_cod_3 year_1_cod_4 year_2_cod_1
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 x 0 0 0 0 5
#> 2 1 x 0 0 0 0 3
#> 3 1 x 0 0 0 0 2
#> 4 2 x 10 8 2 3 0
#> 5 2 x 3 9 1 2 0
#> 6 2 x 1 12 0 1 0
#> # … with 3 more variables: year_2_cod_2 <dbl>, year_2_cod_3 <dbl>,
#> # year_2_cod_4 <dbl>
Creado en 2020-02-26 por el paquete de reprex (v0.3.0)
Preguntas relacionadas
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.