Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using anonymous functions with summarize_each or mutate_each

Tags:

r

dplyr

I want to use anonymous functions in calls to summarize_each:

# how to use an anonymous function in dplyr
df_foo = data_frame(x = rnorm(100),
                    y = rnorm(100))

df_foo %>% 
  summarize_each(funs(function(bar) sum(bar/10)))

How would I go about achieving this? Obviously, naming the function before using it works.

like image 727
tchakravarty Avatar asked Apr 28 '16 06:04

tchakravarty


1 Answers

It's a matter of using a lot of parentheses so everything gets evaluated:

df_foo %>% 
  summarize_each(funs(((function(bar){sum(bar/10)})(.))))
#
# Source: local data frame [1 x 2]
# 
#          x          y
#      (dbl)      (dbl)
# 1 1.113599 -0.4766853

where you need

  • parentheses around the function definition so it gets defined,
  • a set of parentheses with a . to tell funs which parameter to stick the data passed to it in (seemingly redundant with single-parameter functions, but not so with multi-parameter ones; see ?funs for more examples), and
  • parentheses around the whole thing to actually evaluate it,

which is kind of ridiculous, but that seems to be the most concise funs can handle. It makes some sense if you look at what you'd have to write to evaluate a similar anonymous function on its own line, e.g.

(function(bar){sum(bar/10)})(df_foo$x)

though the pair wrapping the whole thing are extra for funs. You can use braces {} instead for the outer pair if you prefer, which might make more syntactic sense.

like image 167
alistaire Avatar answered Oct 01 '22 03:10

alistaire