Ausführen benutzerdefinierter Funktionen

Benutzerdefinierte Funktionen können entweder für jede einzelne Zeile oder für jede Gruppe von Zeilen mit einer Gruppierungsspalte ausgeführt werden. Der erste Fall wird durch " nzApply() abgedeckt, die zweite Funktionalität wird durch die Funktion " nzTAapply() realisiert. Außerdem gibt es zwei flexiblere Funktionen, ' nzRun() und ' nzRunHost(), mit denen der Benutzer die Daten manuell durchgehen kann.

nzApply

Die Funktion " nzApply() wendet eine vom Benutzer bereitgestellte Funktion auf jede Zeile eines gegebenen verteilten Datenrahmens (nz.data.frame) an. Für jede verarbeitete Zeile erwartet sie höchstens eine Ergebniszeile (Vektor, Liste), die in die Ausgabe " mz.data.frame eingefügt wird.
data(iris)
if (nzExistTable('iris')) {nzDeleteTable('iris')}
d <-as.nz.data.frame(iris)
f <- function(x) { return(sqrt(x[[1]])) }
if (nzExistTable('apply_output')) nzDeleteTable('apply_output')
r <- nzApply(d[,1], NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
head(r)
# SQUAREROOT
#1 2.645751
#2 2.626785
#3 2.366432
#4 2.366432
#5 2.366432
#6 2.366432
# this exists also as an overloaded apply method and the following
# returns the same result
nzDeleteTable('apply_output')
r <- apply(d[,1], NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
Wenn Sie eine Funktion auf eine Tabelle anwenden, achten Sie auf die Datentypen. Entweder geben Sie die genaue Teilmenge der Spalten an, deren Typen mit den von der Funktion erwarteten Typen übereinstimmen, oder Sie fügen das Casting der Spalten in das gewünschte Format für die angegebene Funktion hinzu:
f <- function(x) { return(sqrt(as.numeric(x[[1]]))) }
if (nzExistTable('apply_output')) nzDeleteTable('apply_output')
r <- nzApply(d, NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
head(r)
# SQUAREROOT
#1 2.258318
#2 2.213594
#3 2.213594
#4 2.258318
#5 2.258318
#6 2.258318

nzTApply

Die Funktion " nzTApply() wendet eine vom Benutzer bereitgestellte Funktion auf jede Teilmenge (Gruppe von Zeilen) eines bestimmten verteilten Datenrahmens (nz.data.frame) an. Die Teilmengen werden durch eine bestimmte Indexspalte bestimmt. Die Ergebnisse der Anwendung der Funktionen werden in einem Datenrahmen gespeichert. Im folgenden Beispiel wird derselbe " nz.data.frame wie im Beispiel " nzApply() verwendet. Das Beispiel enthält den Irisdatensatz.
print(d)
#SELECT Sepal_Length,Sepal_Width,Petal_Length,Petal_Width, Species FROM nziris
# the following lines do the same - compute the mean value
# in every group
nzTApply(d, d[,5], mean)
nzTApply(d, 'Species', mean)
nzTApply(d, 5, mean)
# Sepal_Length Sepal_Width Petal_Length Petal_Width Species Species
#1 6.588 2.974 5.552 2.026 nan virginica
#2 5.006 3.428 1.462 0.246 nan setosa
#3 5.936 2.770 4.260 1.326 nan versicolor

Details zu

Die Ausgabe dieser Funktionen hängt davon ab, ob ' output.name und ' output.signature angegeben sind. Für " nzApply() wird ein Objekt der Klasse " data.frame zurückgegeben. Das Objekt hat die gleiche Anzahl von Spalten wie die Sequenzen, die von fun zurückgegeben werden. Wird output.name nicht angegeben, wird keine Tabelle erstellt. Wenn für " nzTApply() ein " output.name angegeben wird, muss auch " output.signature angegeben werden. Der Parameter " output.signature kann verwendet werden, um zu vermeiden, dass eine spärliche Tabelle empfangen wird, und um die gewünschten Ausgabespaltentypen festzulegen; wenn der Parameter angegeben wird, muss " fun Werte zurückgeben, die in diese Typen umgewandelt werden können.

Wenn die Funktion ' fun Fehler verursacht, kann der Debugger-Modus verwendet werden, um die Bedingungen zu untersuchen, unter denen Fehler auftreten. Wenn " debugger.mode=TRUE, dann wird die Ergebnistabelle nicht im Netezza gespeichert. Stattdessen wird für jede Gruppe ein Diagnosetest aufgerufen, und die Umgebung der ersten Gruppe, die einen Fehler verursacht, wird zum lokalen R-Client transportiert und im R-Debugger geöffnet.

Betrachten Sie den folgenden R-Code:
nziris = nz.data.frame('iris')
FUN5 = function(x) {
if(min(x[,1]) < 4.5) cov(0) else min(x[,1])
} nzTApply(nziris, 5, FUN5, debugger.mode=T)
Im Debug-Modus liefert die Funktion ' nzTApply() eine Zusammenfassung für die Gruppenverarbeitung. Diese Zusammenfassung wird in einer Tabelle mit den folgenden Spalten dargestellt:
  • Die erste Spalte enthält das Ergebnis oder die Fehlerbeschreibung.
  • Die zweite Spalte enthält die Art des Ergebnisses (try-error im Falle eines Fehlers).
  • Die dritte Spalte enthält den Gruppennamen, für den das gegebene Ergebnis zurückgegeben wird. In diesem Beispiel gibt es drei Gruppen, wobei eine Gruppe einen Fehler erzeugt.
Found 1 error
values type group
1 101 integer virginica
2 supply both 'x' and 'y' or a matrix-like 'x' try-error setosa
3 51 integer versicolor
Dann wird für die erste Gruppe, die einen Fehler verursacht hat, eine gedumpte Umgebung von der entfernten SPU auf den R-Client heruntergeladen und im R-Debugger geöffnet.
nzApply(X, MARGIN, FUN, output.name = NULL, output.signature =
NULL, clear.existing = FALSE, ...)
nzTApply(X, INDEX, FUN = NULL, output.name = NULL, output.signature = NULL,
clear.existing = FALSE, debugger.mode = FALSE, ..., simplify = TRUE)
Dabei gilt:
X
Gibt den Eingabedatenrahmen an.
Rand
Derzeit nicht verwendet, aber das Argument ist erforderlich; NULL muss übergeben werden.
Spaß
Gibt die benutzerdefinierte Funktion an.
FUN kann einen Einzelwert oder eine Zeile zurückgeben. Es erhält eine Teilmenge der Eingabedaten in Form eines data.frame mit Spaltennamen in Kleinbuchstaben.
output.name
Gibt den Namen der auf dem Netezza erstellten Ausgabetabelle an.
output.signature
Bezeichnet die Datentypen für die Spalten der Ausgabetabelle. Wenn keine Angaben gemacht werden, wird eine generische (spärliche) Tabelle erstellt.
clear.existing
Wenn ' TRUE, löschen Sie die Ausgabetabelle, falls sie derzeit existiert.
debugger.mode
Ii ' TRUE, ' nzTApply funktioniert im Debugger-Modus.
...
Diese Argumente werden an " fun übergeben.
Vereinfachung
Nicht verwendet, aus Kompatibilitätsgründen enthalten.
Index
Der Wert, der für den Index des Datensatzes verwendet wird, wobei " INDEX als einer der folgenden Werte angegeben werden kann:
  • Eine Zeichenkette, deren Wert in den Spalten von " X enthalten sein muss.
  • Eine ganze Zahl, die nicht größer ist als die Anzahl der Spalten von " X.