Ich möchte eine Funktion schreiben, die einen Teil des Datensatzes mit dem data.table
Paket auswählen würde. Die angegebenen Parameter der Funktion sind:data.table: Auswählen eines Teils eines Datensatzes unter Bedingung in einer benutzerdefinierten Funktion
- Eingangsdatensatz (
dset
), - variable, auf dem der Datensatz subsetted würde (
seg.var
), - Wert der obigen Variablen (
value
) erklärt .
konnte ich arbeiten Funktion in der Basis R schreiben:
# Function without data.table
data.select <- function(dset, seg.var, value){
dset.out <- dset[dset[[seg.var]] == value,]
return(dset.out)
}
data.select(iris, "Species", "setosa")
Allerdings habe ich es mit data.table
Paket nicht neu schreiben kann: die Funktion unten funktioniert nicht.
# Function with data.table
data.select.dt <- function(dset, seg.var, value){
dset <- as.data.table(dset)
dset.out <- dset[seg.var == value,]
return(dset.out)
}
data.select.dt(iris, Species, "setosa")
Fehler in eval (expr, Envir, enclos): Object 'Art' nicht gefunden
data.select.dt(iris, "Species", "setosa")
Leer data.table (0 Zeilen) von 5 cols: Sepal .length, Sepal.Width, Petal.Length, Petal.Width, Species
der Eingabedatensatz ist in data.frame
Format. Das Ziel des Überschreibens oberhalb einer gegebenen Funktion ist eine Leistungsverbesserung. Jede Hilfe wäre willkommen.
Warum konvertieren Sie in die data.table innerhalb der Funktion? Sie erstellen eine Kopie des gesamten Datensatzes. Es wäre besser, bereits auf einer 'data.table' zu operieren, indem man mit' setDT' in eine Eins konvertiert. In jedem Fall würde ich eine einfache binäre Verbindung machen. Etwas wie 'data.select.dt <- function (dset, seg.var, value) as.data.table (dset) [. (Wert), on = seg.var]' und dann als 'data.select 'ausführen .dt (Iris, "Species", "setosa") ' –
Ich möchte sicher sein, dass der Rest des Codes funktioniert. Da ich mit einem Datensatz arbeite, der größer ist als "iris", möchte ich die Leistung der "Basis" -Untergruppe und der in "data.table" implementierten vergleichen, ohne den ganzen Code neu schreiben zu müssen. – kaksat
@kaksat, siehe 'if (! Data.table :: is.data.table (dset))' in meiner Antwort, sollte etwas Zeit und RAM sparen, wenn 'dset' eine' data.table' wäre. –