Динамическое создание имен переменных в mutate в dplyr через функцию - PullRequest
0 голосов
/ 27 мая 2020

Я хотел бы создать функцию, в которой я мог бы предоставить набор данных и список префиксов. Он использует эти префиксы для создания столбцов, которые включают использование этих префиксов, и возвращает окончательный набор данных, например:

data <- data.frame(demo1_a = 3,demo1_b = 5, demo2_a = 4,demo2_b = 5)
make_vars(data, prefixes = list('demo1', 'demo2'))

make_vars <- function(data, prefixes){
  for(i in prefixes){
    data = data %>% 
      mutate({i}_subtraction = {i}_a - {i}_b,
             {i}_addition = {i}_a + {i}_b,
    )
  }
 return(data)
}

Результат data.frame будет выглядеть так:

  demo1_a demo1_b demo2_a demo2_b demo1_subtraction demo1_addition demo2_addition demo2_subtraction
1       3       5       4       5                -2              8              9                -1

Я вижу в этом ответе: { ссылка }, они ссылаются на фигурно-фигурные операторы ({{}}) в rlang, что позволяет вам динамически ссылаться на имя переменной, но я не нашел, как чтобы «вставить» другие суффиксы, такие как «_subtraction» и «_b», с помощью функции.

1 Ответ

1 голос
/ 27 мая 2020

Вот предлагаемое мной решение

library(tidyverse)
data <- data.frame(a = 1, b = 2, demo1_a = 3,demo1_b = 5, demo2_a = 4,demo2_b = 5)


my_mutate <- function(df, name) {
  name_a <- paste0(name,"_a")
  name_b <- paste0(name,"_b")

  name_add <- paste0(name,"_addition")
  name_sub <- paste0(name,"_subtraction")

  df %>% 
    mutate(!! name_add := !! rlang::parse_expr(name_a) + !! rlang::parse_expr(name_a),
           !! name_sub := !! rlang::parse_expr(name_a) - !! rlang::parse_expr(name_a))


}


data %>% 
  my_mutate("demo1") %>% 
  my_mutate("demo2")

Если вам нужно передать список имен

vector_names <- c("demo1","demo2")

loop_mutate <- function(df, vector_names) {
  for (i in vector_names) {
    df <- df %>% my_mutate(i)
  }
  df
} 

loop_mutate(data,vector_names = vector_names)
...