2016-04-28 18 views
6

chcę użyć funkcji anonimowych w zaproszeniach do summarize_each:Korzystanie anonimowe funkcje z summarize_each lub mutate_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))) 

Jak bym go o osiągnięciu tego celu? Oczywiście nazywanie funkcji przed użyciem działa.

+2

Nie widzę potrzeby - po prostu po prostu wykonaj polecenie "summarize_each (funs (sum (./ 10))"? '.' jest już zdefiniowane jako dane/kolumna, więc nie potrzebujesz dodatkowej funkcji (paska)' part –

Odpowiedz

5

To kwestia wykorzystania dużo nawiasów więc wszystko zostaje oceniona:

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 

gdzie trzeba

  • nawiasów wokół definicji funkcji tak robi zdefiniowane
  • zestaw nawiasy z wartością . określającą parametr, który ma przywierać dane przekazane do niego (na pozór redundantne z funkcjami pojedynczego parametru, ale nie z wieloparametrowymi, patrz ?funs więcej przykładów), a
  • nawiasy wokół całej sprawy właściwie ocenić go,

która jest rodzaj śmieszne, ale to wydaje się być najbardziej zwięzły funs poradzi. Ma to pewien sens, jeśli spojrzysz na to, co musiałbyś napisać, aby ocenić podobną anonimową funkcję we własnej linii, np.

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

chociaż para owijająca całość jest dodatkowa dla funs. Zamiast tego możesz użyć nawiasu klamrowego {}, jeśli wolisz, co może mieć więcej sensu syntaktycznego.

+2

To jest naprawdę skomplikowany sposób zapisu 'df_foo%>% summary_each (funs (suma (./ 10))) ' –

+1

@docendodiscimus Prawda. Zakładałem, że rzeczywista funkcja jest bardziej skomplikowana, ale po prostu użycie '.' jest lepszym rozwiązaniem, zanim odwołam się do powyższej składni. – alistaire

+0

@docendodiscimus Tak, ponieważ to, co naprawdę chcę zrobić, to podzielić przez 10. – tchakravarty

Powiązane problemy