3

パイプラインで作業しているときに、ベクトルから渡される関数名を使用してdplyr関数を渡したいと思います。mutateNSE

与えられた 2 つの関数名のベクトル:

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

ここでの適用方法には意味がないと思います。したがって、私の質問:関数をベクトルから文字列として渡すことができるように使用する方法は?dplyr

4

2 に答える 2

3

単一の文字列の値を使用getして抽出できます。getここでは関数なので、関数そのものを返します。

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 に答える