2016-04-28 18 views
6

ich anonyme Funktionen in Anrufe summarize_each verwenden möchten:Mit anonymen Funktionen mit summarize_each oder 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))) 

Wie würde ich mich dies zu erreichen? Offensichtlich funktioniert die Benennung der Funktion vor ihrer Verwendung.

+2

Ich sehe nicht die Notwendigkeit dafür - warum machst du nicht einfach 'summieren_jeach (Spaß (Summe (./ 10)))'? Das '.' ist bereits als data/column definiert, so dass Sie den zusätzlichen' function (bar) 'part nicht benötigen –

Antwort

5

Es ist eine Frage viele Klammern der Verwendung so alles ausgewertet wird:

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 

wo Sie

  • Klammern um die Funktionsdefinition müssen so definiert wird,
  • eine Reihe von Klammern mit ., um funs mitzuteilen, welcher Parameter die Daten, die an ihn übergeben werden, anhängt (scheinbar redundant mit Ein-Parameter-Funktionen, aber nicht so mit Multi-Parameter-Funktionen; siehe ?funs für weitere Beispiele) und
  • Klammern um die ganze Sache, die es zu bewerten, tatsächlich

, die irgendwie lächerlich ist, aber das scheint behandeln die knappste funs kann zu sein. Es macht Sinn, wenn Sie sich ansehen, was Sie schreiben müßten, um eine ähnliche anonyme Funktion in einer eigenen Zeile auszuwerten, z.

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

obwohl das Paar, das das Ganze wickelnd, extra für funs sind. Sie können Klammern {} stattdessen für das äußere Paar verwenden, wenn Sie bevorzugen, was syntaktisch sinnvoller sein könnte.

+2

Dies ist eine wirklich komplizierte Art,' df_foo%>% summarize_each (Spaß (Summe (./ 10))) ' –

+1

@docendodiscimus True. Ich nahm an, dass die eigentliche Funktion komplizierter war, aber die Verwendung von '.' ist ein besserer Weg, um zu der obigen Syntax zurückzukehren. – alistaire

+0

@docendodiscimus Ja, weil was ich wirklich tun möchte ist durch 10 dividieren. – tchakravarty

Verwandte Themen