【问题标题】:Dplyr non standard evaluation with function name passed as a string函数名称作为字符串传递的 Dplyr 非标准评估
【发布时间】:2017-04-17 13:42:09
【问题描述】:

在使用dplyr 管道时,我想使用NSE 将函数传递给mutate,函数名称是从向量传递的。

示例

给定两个函数名的向量:

funs <- c("sum", "mean")

我想使用第一个值来获得总和:

require(dplyr)
mtcars %>% 
  group_by(cyl) %>% 
  mutate_(res = funs[1](hp))

这会导致错误:

Error in as.lazy_dots(list(...)) : attempt to apply non-function

do.call

基于do.call 的解决方案似乎为 sum 生成了一些结果:

mtcars %>% 
  group_by(cyl) %>% 
  mutate_(res = do.call(funs[1], .))

但尝试使用mean时失败:

>> mtcars %>% 
+   group_by(cyl) %>% 
+   mutate_(res = do.call(funs[2], .))
Error in mean.default(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4,  : 
  argument "x" is missing, with no default

我猜它在这里的应用方式根本没有意义。因此我的问题是:如何在dplyr 中使用,以便函数可以作为字符串从向量传递?

【问题讨论】:

    标签: nse r function dplyr scoping nse


    【解决方案1】:

    这两个都使用mutate而不是mutate_

    mtcars %>% 
      group_by(cyl) %>% 
      mutate(res = do.call(funs[2], list(hp)))
    
    mtcars %>% 
      group_by(cyl) %>% 
      mutate(res = match.fun(funs[2])(hp))
    

    另外请注意,如果我们使用 [[2]] 代替 [2],那么这些将适用于问题中出现的字符向量 funs 以及 funs &lt;- c(sum, mean)

    【讨论】:

      【解决方案2】:

      我们可以使用getget 提取单个字符串的值。这里是一个函数,所以返回函数本身。

      mtcars %>% 
           group_by(cyl) %>% 
           mutate(res= get(funs[1])(hp))
      

      用于传递额外的参数

      mtcars$hp[1] <- NA
      mtcars %>%
            group_by(cyl) %>% 
            mutate(res= get(funs[1])(hp, na.rm = TRUE))
      

      【讨论】:

      • 一如既往,这非常有用。谢谢;您愿意添加一个简短的解释吗?另外,我如何将参数传递给这个函数,比如na.rm = TRUE
      • @Konrad 我更新了帖子。我之前没有在您的评论中看到您的修改
      • 刚刚使用get() 绕过nse 使用purrr(实际上是purrrlyr)中的字符串将函数名称传递给by_row。这是一个记录不足的解决方案,非常有帮助!! (某人,例如我,应该提交推送请求/文档更新)。
      • @D.Woods 另一个选择是mtcars %&gt;% group_by(cyl) %&gt;% mutate(res = eval(call(funs[1], hp)))
      猜你喜欢
      • 2019-03-23
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多