studio - Cree nuevas variables con mutate_at manteniendo las originales.
r dplyr cheat sheet (1)
Considere este simple ejemplo:
library(dplyr)
dataframe <- data_frame(helloo = c(1,2,3,4,5,6),
ooooHH = c(1,1,1,2,2,2),
ahaaa = c(200,400,120,300,100,100))
# A tibble: 6 x 3
helloo ooooHH ahaaa
<dbl> <dbl> <dbl>
1 1 1 200
2 2 1 400
3 3 1 120
4 4 2 300
5 5 2 100
6 6 2 100
Aquí quiero aplicar la función
ntile
a todas las columnas que contienen
oo
, pero me gustaría que estas nuevas columnas se llamen
cat
+ la columna correspondiente.
sé que puedo hacerlo
dataframe %>% mutate_at(vars(contains(''oo'')), .funs = funs(ntile(., 2)))
# A tibble: 6 x 3
helloo ooooHH ahaaa
<int> <int> <dbl>
1 1 1 200
2 1 1 400
3 1 1 120
4 2 2 300
5 2 2 100
6 2 2 100
Pero lo que necesito es esto
# A tibble: 8 x 5
helloo ooooHH ahaaa cat_helloo cat_ooooHH
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 5 2 100 2 2
7 6 2 100 2 2
8 6 2 100 2 2
¿Existe una solución que NO requiera almacenar los datos intermedios y fusionarlos nuevamente con el marco de datos original?
Editado para reflejar los cambios en dplyr.
A partir de dplyr 0.8.0,
funs()
está en desuso y se debe usar
list()
con
~
su lugar.
Puede
.funs
nombres a las funciones a la lista que pasa a
.funs
para crear nuevas variables con los nombres como sufijos adjuntos.
dataframe %>% mutate_at(vars(contains(''oo'')), .funs = list(cat = ~ntile(., 2)))
# A tibble: 6 x 5
helloo ooooHH ahaaa helloo_cat ooooHH_cat
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2
Si lo desea como prefijo, puede usar
rename_at
para cambiar los nombres.
dataframe %>%
mutate_at(vars(contains(''oo'')), .funs = list(cat = ~ntile(., 2))) %>%
rename_at( vars( contains( "_cat") ), list( ~paste("cat", gsub("_cat", "", .), sep = "_") ) )
# A tibble: 6 x 5
helloo ooooHH ahaaa cat_helloo cat_ooooHH
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2
Código anterior con
funs()
de versiones anteriores de
dplyr
:
dataframe %>%
mutate_at(vars(contains(''oo'')), .funs = funs(cat = ntile(., 2))) %>%
rename_at( vars( contains( "_cat") ), funs( paste("cat", gsub("_cat", "", .), sep = "_") ) )