usar studio sheet mutate meaning functions como cheat r dplyr

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 = "_") ) )