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.
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
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.
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**
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.
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).)
Recommended Posts