如何使用mutate_each(和summarise_each)的匿名函数?

Ale*_*lex 7 r anonymous-function dplyr

我们知道,可以在R中调用函数而不将它们分配给环境,例如

> (function(x){x/2})(5)
[1] 2.5
Run Code Online (Sandbox Code Playgroud)

我想在mutate_each(或summarise_each)调用中动态使用这些函数.例如,用

df <- data.frame(a = runif(10), b = rnorm(10))

我可能会尝试执行以下操作之一,但它们都会返回错误:

library(dplyr)

> df %>%
+     mutate_each(funs((function(x){x/2})), a, b)
Error in eval(substitute(expr), envir, enclos) : 
  Unsupported type CLOSXP for column "a"
> 
> df %>%
+     mutate_each(list((function(x){x/2})), a, b)
Error: is.fun_list(calls) is not TRUE
> 
> 
> df %>%
+     mutate_each(funs((function(x){x/2})(.)), a, b)
Error in vapply(dots[missing_names], function(x) make_name(x$expr), character(1)) : 
  values must be length 1,
 but FUN(X[[1]]) result is length 2
> 
Run Code Online (Sandbox Code Playgroud)

但是,如果我将该函数分配给工作区,则所有函数都按预期工作:

tmp_fn <- function(x){x/2}
Run Code Online (Sandbox Code Playgroud)

   > df %>%
+     mutate_each(funs(tmp_fn), a, b)
             a            b
1  0.360048105 -0.452285314
2  0.020175136  0.253063103
3  0.002351454 -0.148997643
4  0.262808493 -0.599555244
5  0.057246370  0.007567076
6  0.400027700  0.264901865
7  0.120505411 -0.346171709
8  0.266166200  0.116066231
9  0.031302148 -0.129739601
10 0.250212897  0.230194217
Run Code Online (Sandbox Code Playgroud)

有没有办法在调用mutate_each或动态定义函数summarise_each

akr*_*run 5

我们可以用括号包装函数调用

df %>%
     mutate_each(funs(((function(x){x/2})(.))))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.在这里,我以为我已经使用了足够的括号! (2认同)