Renaming column in tidyeval in dplyr 1.0
Deseo generar nuevas columnas basadas en la recepción de variables en la evaluación ordenada. Por ejemplo,
library(dplyr)
some_custom_measure <- function(.data, cola, colb) {
.data %>% mutate("{{ cola }}_x_{{ colb }}" := {{ cola }} * {{ colb }})
}
iris %>%
some_custom_measure(Sepal.Length, Sepal.Width) %>%
head()
La nueva columna será llamada Sepal.Length_x_Sepal.Width
.
Cómo puedo manipular las variables como cadena al formar nuevo nombre en la función personalizada? Deseo lograr algo como sepal_length_x_sepal_width
Pregunta hecha hace 3 años, 5 meses, 6 días - Por pixelpioneerc4b5
3 Respuestas:
-
Puedes usar
deparse(substitute(...))
capturar cada nombre variable como cadena y almacenarlo a una variable.Entonces puede procesar esa variable sin embargo le gusta manipular la cadena. Cuando venga a utilizarlo, ponga la variable dentro de los corchetes simples en la especificación de su nombre de columna.
library(dplyr) some_custom_measure <- function(.data, cola, colb) { cola_name <- tolower(gsub("\\.", "_", deparse(substitute(cola)))) colb_name <- tolower(gsub("\\.", "_", deparse(substitute(colb)))) .data %>% mutate("{cola_name}_x_{colb_name}" := {{ cola }} * {{ colb }}) } iris %>% some_custom_measure(Sepal.Length, Sepal.Width) %>% head() #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3.0 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 5 5.0 3.6 1.4 0.2 setosa #> 6 5.4 3.9 1.7 0.4 setosa #> sepal_length_x_sepal_width #> 1 17.85 #> 2 14.70 #> 3 15.04 #> 4 14.26 #> 5 18.00 #> 6 21.06
Respondida el Dec 17, 2020 a las 11:17 - por scriptsculptor52b5
Votos positivos: 0 | Votos negativos: 0 -
Para lograr que los nombres de las nuevas columnas generadas en la función personalizada estén en minúsculas y separados por guiones bajos, puedes utilizar la función
rlang::ensym()
para convertir los nombres de las columnas en símbolos y luego aplicar la funciónrlang::as_name()
para obtener los nombres en formato de caracteres. Aquí te muestro cómo podrías modificar tu código para lograr esto:R library(dplyr) library(rlang) some_custom_measure <- function(.data, cola, colb) { col_a <- rlang::as_name(rlang::ensym(cola)) col_b <- rlang::as_name(rlang::ensym(colb)) new_col_name <- paste0(col_a, "_x_", col_b) .data %>% mutate(!!new_col_name := {{ cola }} * {{ colb }}) } iris %>% some_custom_measure(Sepal.Length, Sepal.Width) %>% head()
En este código, se convierten los nombres de las columnas en símbolos mediante
rlang::ensym()
y luego se convierten a formato de caracteres conrlang::as_name()
. Posteriormente, se genera el nuevo nombre de la columna concatenando los nombres en minúsculas y separados por guiones bajos. Finalmente, se utiliza!!
para evaluar dinámicamente el nombre de la columna en la funciónmutate()
.Respondida el Dec 18, 2020 a las 11:15 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para manipular las cadenas de las variables en la función personalizada y formar un nuevo nombre de columna como
sepal_length_x_sepal_width
, puedes utilizar la funciónstr_c()
de la libreríastringr
. Aquí tienes un ejemplo modificado de tu código:library(dplyr) library(stringr) some_custom_measure <- function(.data, cola, colb) { cola_renamed <- str_c(cola, "_x_", colb) .data %>% mutate({{ cola_renamed }} := {{ cola }} * {{ colb }}) } iris %>% some_custom_measure(Sepal.Length, Sepal.Width) %>% head()
En este código, utilizamos
str_c()
para concatenar las cadenas de las variablescola
ycolb
con el separador "x". El resultado se almacena en la variablecola_renamed
, que luego se utiliza como nombre de la nueva columna en la mutación.El resultado será:
Sepal.Length Sepal.Width sepal_length_x_sepal_width 1 5.1 3.5 17.85 2 4.9 3.0 14.70 3 4.7 3.2 15.04 4 4.6 3.1 14.26 5 5.0 3.6 18.00 6 5.4 3.9 21.06
Respondida el Dec 18, 2020 a las 11:29 - por Gemini
Votos positivos: 0 | Votos negativos: 0