首页 > 解决方案 > 通过函数在 dplyr 中动态构造 mutate 中的变量名

问题描述

我想做一个函数,我可以在其中提供数据集和前缀列表。它使用这些前缀来构造涉及使用这些前缀的列,并返回最终数据集,如下所示:

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

我在这个答案中看到:https ://stackoverflow.com/a/59224230/372526 ,它们引用了卷曲运算符({{}}),rlang其中允许您动态引用变量名,但我还没有找到如何通过函数“粘贴”其他后缀,如“_subtraction”和“_b”。

标签: rdplyr

解决方案


这是我提出的解决方案

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)

推荐阅读