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, 4 meses, 29 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ón rlang::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 con rlang::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ón mutate().

    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ón str_c() de la librería stringr. 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 variables cola y colb con el separador "x". El resultado se almacena en la variable cola_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