3

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

例子

给定两个函数名称的向量:

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基于解决方案似乎为总和产生了一些结果:

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

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

4

2 回答 2

3

我们可以使用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))
于 2016-12-02T15:33:08.403 回答
2

这些都使用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 <- c(sum, mean)

于 2016-12-02T15:44:11.177 回答