[PYTHON] Ist Rs do.call () eine klassische Funktion höherer Ordnung? Erfahren Sie, wie man es benutzt

Als ich mir die Kaggle-Kernel ansah, die den Teilnehmercode von Kaggle einführen, sah ich einen R-Code, der "do.call ()" stark nutzt. Da "do.call ()" für mich fast neu war, habe ich es nachgeschlagen und festgestellt, dass es sich um eine relativ klassische Funktion handelt und nicht schwer zu verwenden ist. Machen Sie sich unten eine Notiz, damit Sie sie nicht vergessen.

Übersicht über do.call ()

Zunächst zitiere ich aus dem CRAN-Handbuch.

do.call - Execute a Function Call

Description

do.call constructs and executes a function call from a name or a function and a list of arguments to be passed to it.

Usage do.call(what, args, quote = FALSE, envir = parent.frame())

Arguments

  • what either a function or a non-empty character string naming the function to be called.
  • args a list of arguments to the function call. The names attribute of args gives the argument names.
  • quote a logical value indicating whether to quote the arguments.
  • envir an environment within which to evaluate the call. This will be most useful if what is a character string and the arguments are symbols or quoted expressions.

Die Funktion ist "Funktionsaufruf". Die R-Sprache verfügt über eine Vielzahl von Apply-Funktionen, daher scheint sie berühmt zu sein, aber es scheint, dass diese do.call () je nach Fall auch verwendet wird. Es scheint vier Argumente zu erfordern, wie oben beschrieben, aber die ersten beiden sind erforderlich, wobei das Funktionsobjekt "what" und das Argument "args" an es übergeben werden sollen. "args" muss eine Listenvariable sein.

Hier sind einige Anwendungsbeispiele.

Definieren Sie zunächst die Funktion.

# define my own function
myrange <- function (larg) {
    nv <- unlist(larg)
    rg <- max(nv) - min(nv)
    return(rg)
}

Hier verwenden wir "Iris", auf die R sofort Bezug nehmen kann.

# Data.Frame example
head(iris)

Table 1. Iris Dataset r_do_call1.PNG

Rufen Sie () die definierte Funktion "myrange" auf.

do.call(myrange, list(iris$Sepal.Length))
# Out: 3.6

Wie erwartet wurde der Maximalwert von "Sepal.Lengh" - der Minimalwert (3.6) - ausgegeben. Bei der Berechnung mit dem eingebauten R-Bereich () waren es vorerst 4,3, 7,9 (Minimalwert, Maximalwert), sodass die Lösung mit 3,6 (= 7,9 - 4,3) oben übereinstimmt.

Schauen wir uns ein anderes Beispiel an. Bereiten Sie zunächst eine Funktion vor, um den numerischen Wert zu normalisieren. Bereiten Sie ein Eingabedatenbeispiel vor und führen Sie do.call () wie folgt aus.

normalize <- function(x, m=mean(x), s=sd(x)) {
    (x - m) /s
}

myseq = list(c(1, 3, 6, 10, 15))
do.call(normalize, myseq)

# -1.0690449676497 -0.712696645099798 -0.17817416127495 0.534522483824849 1.4253932901996

Der Durchschnitt und die Standardabweichung der numerischen Ausgabeliste sind

mean of normalized =
[1] -5.572799e-18
standard deviation = 
[1] 1

Da es sich um einen Wert nahe 0 und 1 handelt, wie in gezeigt, ist ersichtlich, dass die erwartete Normalisierung ausgeführt werden kann.

Vergleiche mit Python Pandas apply ()

Es scheint, dass Rs do.call () der in Python integrierten Funktionszuordnung () ähnlich ist, aber ich persönlich benutze es nicht viel, also werde ich es dieses Mal mit Pandas 'apply () vergleichen. (Referenz: "Python für die Datenanalyse" - O'reilly media) Bereiten Sie zunächst die Probendaten vor.

# Sample Data
frame = pd.DataFrame(np.random.randn(4,3), columns=list('bde'),
                    index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame

** Table 2. Data Example** do_call_py2.PNG

Bereiten Sie eine Funktion zur Berechnung des Bereichs (Maximalwert - Minimalwert) vor und wenden Sie () auf pd.DataFrame an.

# define lambda function
f = lambda x: x.max() - x.min()
frame[['d']].apply(f)
# if I execute frame['d'].apply(f), error is raised. "apply()" is for pd.DataFrame

Dies ist das erwartete Verhalten.

Out: d    4.016529
dtype: float64

Verwenden Sie im folgenden Muster iloc [], um Spalten numerisch anzugeben.

frame.iloc[:, [2]].apply(f)

# Out: e    2.160329
# dtype: float64

Da die Sequenz eine bestimmte Funktion sein soll, müssen wir Spalten in einer Liste angeben, z. B. "frame [['d']]" oder "frame.iloc [:, [2]]". Ist. (Wenn dies auf "frame ['d']", "frame.iloc [:, 2]" gesetzt ist, wird dies als apply () für das pd.Series-Objekt und die Verarbeitung für jedes Skalarelement interpretiert, was zu einem Fehler führt.)

Damit wurde die gleiche Operation wie bei R und do.call () realisiert.

Zusammenfassung

Obwohl do.call () eine Funktion ist, die (nur für mich?) Selten gesehen wird, scheint sie in der Situation des "Kombinierens nach der Verarbeitung von data.frame" verwendet zu werden. Die Funktionsgruppe Anwenden ist jedoch praktischer, und do.call () scheint "klassisch" geschrieben zu sein. Persönlich möchte ich do.call () nicht positiv verwenden, aber wenn ich do.call () im menschlichen Code sehe, möchte ich es richtig verstehen, ohne mich zu beeilen.

Ich kann in Python nichts finden, was do.call () entspricht, aber es scheint, dass die gewünschte Operation erreicht werden kann, indem die Verarbeitung mit der Appas-Notation von Pandas () oder der List-Inclusion-Notation (mit getrennten Daten) durchgeführt wird.

(R verwendet Version 3.3.1 (auf einem Jupyter-Notizbuch), Python verwendet Version 3.5.2 (auf einem Jupiter-Notizbuch).)

Verweise

Recommended Posts

Ist Rs do.call () eine klassische Funktion höherer Ordnung? Erfahren Sie, wie man es benutzt
So rufen Sie eine Funktion auf
Verwendung der Zip-Funktion
So erstellen Sie eine rekursive Funktion
Verwendung der Zip-Funktion von Python
Erfahren Sie, wie Sie Docker verwenden, indem Sie eine Umgebung für Django + MySQL erstellen
[Pandas] Was ist set_option?
Verwendung ist und == in Python
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
[Python] Verwendung von Hash-Funktion und Taple.
[Go] So schreiben oder rufen Sie eine Funktion auf
Wie man eine öffentliche Funktion in Pytest verspottet
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von pip, einem Paketverwaltungssystem, das für die Verwendung von Python unverzichtbar ist
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
Hinweise zur Verwendung von AIST Spacon ABCI
Verwendung von Pandas 2
Verwendung von Virtualenv
So verwenden Sie eine Bibliothek, die ursprünglich nicht in Google App Engine enthalten war
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Ein Memorandum zur Verwendung von Keras 'keras.preprocessing.image
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
So überprüfen Sie, ob es sich um einen Wörterbuch-Typ (Wörterbuch, Hash) handelt, indem Sie einen oder alle verwenden
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Scraping mit Python-Selen ist alt! ?? ・ ・ ・ Verwendung von Pyppeteer
Verwendung von return
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Wie man Imutils benutzt
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
Verwendung von GitHub auf einem Server für mehrere Personen ohne Kennwort
Verwendung von Fujifilm X-T3 als Webcam unter Ubuntu 20.04
So drucken Sie Zeichen als Tabelle mit der Druckfunktion von Python
Verwendung von cuML SVC als Gridsearch-CV-Klassifikator
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So verwenden Sie eine andere Datei als .fabricrc als Konfigurationsdatei
VIM ist gut zu bedienen - zumindest ein Anfang, um es zu benutzen
Verwendung von Qt Designer