2016-06-13 14 views
0

Ich habe einen Datenrahmen (train), der eine YOB (Jahr der Geburt) Spalte enthält. Ich mag die Age in einer separaten Spalte berechnen, etwa so:Neue Spalte zu DataFrame innerhalb einer Funktion hinzufügen

train$Age = 2016 - train$YOB 

Dies funktioniert gut.

Das Problem ist, dass ich diese Operation (zusammen mit anderen Vorverarbeitungsoperationen) auch für eine Reihe anderer Datenframes durchführen möchte. Also, ich dachte, die gemeinsamen Elemente in einer Funktion zu extrahieren und die Datenrahmen übergeben als Parameter an die Funktion zu verarbeiten:

preprocess = function(d) { 
    d$Age = 2016 - d$YOB 
    # other transformations... 
} 

Nach der Definition der Funktion oben, erwartete ich, dass preprocess(train) Aufruf würde die oben erwähnten Transformationen durchführt auf mein Datenrahmen. Aber das tut es nicht. Zum Beispiel ist train$AgeNULL nach dem Anruf.

Warum transformiert die preprocess-Funktion den Datenrahmen nicht wie erwartet? Gibt es eine Möglichkeit, das zu beheben?

+0

'preprocess = Funktion (d) d $ Alter << - 2016 - d $ YOB' oder' preprocess = Funktion (d) 2016 - d $ YOB; d $ age <- preprocess (d) '. Objekt, das in Funktion gemacht wurde, ist nicht außerhalb der Funktion, außer für '<< -'. – cuttlefish44

+0

@ crayfish44 Jetzt bekomme ich eine Fehlermeldung, dass * Objekt vom Typ 'closing' ist keine Teilmenge * – GolfWolf

Antwort

1

Sie fügen die neue Spalte nur innerhalb der Funktion hinzu, aber Funktionen ändern normalerweise nicht die Werte außerhalb dieser Funktion. Es gibt einen schnellen und dreckigen Weg über < < - sollte das aber wirklich nicht nutzen! Weil Ihre Funktion Werte außerhalb der Funktion ändern würde und Funktionen dies nicht tun sollen. Es ist ein sehr schlechter Stil. Werte sollten Funktionen als Argumente eingeben und sie als Rückgabewerte belassen.

So den Datenrahmen in Ihrer Funktion ändern und es zurück geben als Rückgabewert:

preprocess = function(d) { 
    d$Age = 2016 - d$YOB 
    return(d) 
} 

test <- data.frame(YOB=2017:2020) 

test <- preprocess(test) 

print(test) 
2

In R (und fast alle Sprachen), wenn die Steuerung auf eine Funktion übertragen wird, setzt der Interpreter einen „Rahmen“ welche Variablen wären in der Funktion verfügbar.

Betrachten wir die Variablen a und b sowie die Funktion „vorverarbeitet“:

> a <- 2 
> b <- 3 
> preprocess <- function(a){a <- a + b; cat("value of a=", a, "\n")} 
> preprocess(a) 
value of a= 5 
> cat("value of a=", a, "\n") 
value of a= 2 

die Variablen Hier ist „a“ und „b“, die beide innerhalb der Funktion zu sehen waren, und der Wert der Variablen „a“ hat sich im Rahmen der Funktion geändert. Aber sobald die Funktion abgeschlossen und zurückgegeben wurde, wurde diese Umgebung verworfen und der aktualisierte Wert der Variablen wurde "verloren".

Der globale Wert der Variable, die 2 früher war, blieb unverändert.

Wenn Sie jedoch den Wert von „a“ aus der Funktion wieder zurück, wird der Wert von „a“ geändert wird, finden Sie in diesem Beispiel:

> a <- 2 
> b <- 3 
> preprocess <- function(a){a <- a + b; cat("value of a=", a, "\n"); return(a)} 
> a <- preprocess(a) 
value of a= 5 
> cat("value of a=", a, "\n") 
value of a= 5 

Sehen Sie diese Hilfe Referenz in Ihrer R Sitzung ?environment für Mehr Informationen.

Verwandte Themen