【问题标题】:Dynamically construct variable names in mutate in dplyr via a function通过函数在 dplyr 中动态构造 mutate 中的变量名
【发布时间】:2020-09-14 15:34:32
【问题描述】:

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

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”,通过函数。

【问题讨论】:

  • 我不认为你想要的结果符合你的要求,为什么你需要 a 和 b 也不应该起始 df 是data &lt;- data.frame(a = 1, b = 2, demo1_a = 3,demo1_b = 5, demo2_a = 4,demo2_b = 5)
  • 你是对的。我不小心复制了这个问题的早期版本

标签: r dplyr


【解决方案1】:

这是我提出的解决方案

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)

【讨论】:

  • 非常感谢您抽出宝贵时间来做这件事。我完全迷路了。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多