【问题标题】:How to pass a dynamic column name in a pipe in custom function in R如何在 R 中的自定义函数的管道中传递动态列名
【发布时间】:2022-02-07 07:23:03
【问题描述】:

我已经基于这个线程Use dynamic variable names in `dplyr` 创建了一个带有 dplyr::mutate() 的动态列名,现在我想对新列进行排序....但我没有正确传递列名

library(glue)
library(dplyr)

# data
set.seed(123)
df <- data.frame(distance = sample(1:100, size = 10))

# custom function
multiply_function <- function(df, metric, multiplier){
  
  df %>% 
    mutate(., "{{metric}}_x{{multiplier}}" := {{metric}} * multiplier) %>% 
    arrange(desc("{{metric}}_x{{multiplier}}")) # <--- this is not working
}

df %>% 
  multiply_function(., metric = distance, multiplier = 3)

   distance distance_x3
1        31          93
2        79         237
3        51         153
4        14          42
5        67         201
6        42         126
7        50         150
8        43         129
9        97         291
10       25          75

【问题讨论】:

    标签: r dplyr custom-function


    【解决方案1】:

    不幸的是,我不知道是否有任何方法可以对不在:= 左侧的任何东西使用这种漂亮的胶合语法。那就是魔法发生了。如果您处理显式转换以总结您自己并手动构建字符串,您可以获得一些工作。这不是很漂亮,但这很有效

    multiply_function <- function(df, metric, multiplier){
      metric <- ensym(metric)
      newname <- glue::glue("{rlang::as_string(metric)}_x{as.character(multiplier)}")
      df %>% 
        mutate("{newname}" := !!metric * multiplier) %>% 
        arrange(desc(.data[[newname]]))
    }
    

    【讨论】:

    【解决方案2】:

    如果该函数是管道本身的一部分,我不确定这个安排步骤是否最好放在函数中。如果尝试制作多个变量,可能会出现问题。对于一个新变量:

    multiply_function <- function(df, metric, multiplier){
      df %>% 
        mutate("{{metric}}_x{{multiplier}}" := {{metric}} * multiplier) %>%
        arrange(desc(!!rlang::sym(setdiff(names(.), names(df)))))
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多