【问题标题】:Custom functions: How to refer to another column using sym() and !! (bang bang) without using funs() in dplyr 0.8.0?自定义函数:如何使用 sym() 和 !! 引用另一列(砰砰)没有在 dplyr 0.8.0 中使用 funs()?
【发布时间】:2019-03-06 12:08:24
【问题描述】:

dplyr 0.8.0 中,包装器funs()(在mutate_at()summarise_at() 中使用)被软性弃用。

推荐的新语法是使用~sum(.) 而不是funs(sum(.)),这是我之前使用的“旧样式”。我的目标是将旧语法转换为新语法,但是当funs() 中的函数调用使用 (!!sym()) 将字符输入 列名 转换为可以在函数中识别的符号。

这是一个虚构的示例,说明我将如何以旧的dplyr 样式编写函数。

var 是一个字符串,表示列名,在funs() 处乘以Sepal.Length

multiply_by <- function(var){
  iris %>%
    mutate_at("Sepal.Length",funs(.*!!sym(var)))
}
multiply_by("Sepal.Width") # This works

我的问题是我无法弄清楚如何将其转换为新的 ~ 语法而不会遇到错误。如果我运行以下命令,则会触发“无效参数类型”错误:

multiply_by2 <- function(var){
  iris %>%
    mutate_at("Sepal.Length",~.*!!sym(var))
}
multiply_by2("Sepal.Width")
# Error in !sym(var) : invalid argument type 

有人可以帮忙吗?目前我可以使用funs(),但由于它已被软弃用,我想在/当它完全被硬弃用时将我的代码迁移到稳定的格式。谢谢!

【问题讨论】:

  • 试试mutate_at("Sepal.Length", list(~.*!!sym(var)))
  • 谢谢 - 但这似乎触发了同样的错误 - “!sym(var) 中的错误:无效的参数类型”
  • 尝试iris %&gt;% mutate_at("Sepal.Length", list( ~ .* .data[[var]])),如issues中所述
  • 谢谢 - 就像一个魅力!它不是一个“dplyr”解决方案,而是解决了我的问题。
  • 同意。当您需要使用 3-4 个额外的函数来包装函数调用时,它会破坏可读性和使用管道!

标签: r function dplyr nse


【解决方案1】:

issues 中提到的一个选项是使用.data

multiply_by2 <- function(var){
 iris %>% 
       mutate_at("Sepal.Length", list( ~ .* .data[[var]]))

}

multiply_by2("Sepal.Width")

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2014-07-26
    • 2021-06-11
    • 2017-11-27
    • 1970-01-01
    相关资源
    最近更新 更多