How to use anonymous functions for mutate_each (and summarise_each)?

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

As we know, it is possible to call functions in R without assigning them to the environment, e.g.

> (function(x){x/2})(5) [1] 2.5 

I would like to use functions like these, on the fly, in a mutate_each (or summarise_each) call. For example, with

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

I might attempt to do one of the following, but they all return errors:

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 >  

However, if I assign the function to the workspace, then all works as expected:

tmp_fn <- function(x){x/2} 

and

   > 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 

Is there a way to dynamically define functions in the call to mutate_each or summarise_each?

回答1:

We can wrap the function call with parentheses

df %>%      mutate_each(funs(((function(x){x/2})(.)))) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!