Ich habe eine data.table, die mehrere binäre Spalten mit den gleichen Werten enthält, die ich in einem Vorgang rekodieren möchte. Ich habe eine Funktion geändert, die ursprünglich für data.frames geschrieben wurde, bin mir aber nicht sicher, ob ich wirklich die Geschwindigkeit von data.table mit der Art und Weise, wie ich sie geändert habe, ausnutze: speziell vermute ich, dass die Funktion möglicherweise noch Werte kopiert.Effiziente Funktionen für data.tables schreiben, die durch Referenz ersetzen
Wie kann ich sicherstellen, dass die Funktion Werte durch Referenz ersetzt?
Hier Spielzeug Datensatz ist:
# Example data:
id <- c(1,2,3,4,5)
fruit <- c("apple", "orange", "banana", "strawbery", "rasberry")
mydate <- c("2015-09-01", "2015-09-02", "2015-11-15", "2016-02-24", "2016-03-08")
eaten <- c("y", "y", "n", "y", "u")
present <- c("n", "n", "y", "y", "y")
dt <- data.table(id, fruit, mydate, eaten, present)
dt[, mydate := as.Date(mydate, format = "%Y-%m-%d")]
dt[, sex := c("m", "f", "f", "m", "f")]
# Columns to update:
bincols <- c("eaten", "present")
Vor Umkodierung, sieht die Daten wie folgt:
> dt
id fruit mydate eaten present sex
1: 1 apple 2015-09-01 y n m
2: 2 orange 2015-09-02 y n f
3: 3 banana 2015-11-15 n y f
4: 4 strawbery 2016-02-24 y y m
5: 5 rasberry 2016-03-08 u y f
ist die Funktion:
recode.multi <- function(datacols, oldval, newval) {
for (i in 1:length(datacols)) {
datacols[datacols == oldval[i]] = newval[i]
}
datacols
}
... angewendet zu den Daten:
dt[, (bincols) := lapply(.SD, recode.multi, oldval = c("u", "n", "y"), newval = c(NA_real_, 0, 1)), .SDcols = bincols]
... und die Ausgabe, die die Werte wie gewünscht aktualisiert, aber nicht sicher ist, ob die Spalten während dieses Vorgangs kopiert werden?
> dt
id fruit mydate eaten present sex
1: 1 apple 2015-09-01 1 0 m
2: 2 orange 2015-09-02 1 0 f
3: 3 banana 2015-11-15 0 1 f
4: 4 strawbery 2016-02-24 1 1 m
5: 5 rasberry 2016-03-08 NA 1 f
Ich habe versucht, die letzten ‚=‘ in der Funktion Wechsel zu ‚: =‘ einen Fehler bekam aber erneut zu prüfen, ob ‚datacols‘ ein data.table war. Hinzufügen einer Klausel zu der Funktion, um zu überprüfen, ob is.data.table == TRUE das Problem nicht gelöst hat (gleicher Fehler zurückgegeben).
Irgendwelche Gedanken über die meisten data.table geeigneten Weg, um diese Funktion zu nähern, würde sehr geschätzt werden.
Ungewiß über die Vervielfältigung, aber das ist ein feines Stück Code. Ich bin mir nicht sicher, was Sie hier meinen: "Ich habe versucht, das letzte' = 'in der Funktion zu': = 'zu ändern." Welche '=' wolltest du ändern? – lmo
Ich habe versucht: 'recode.multi <- Funktion (Datacols, oldval, newval) { für (i in 1: Länge (Datencols)) { Datenzellen [Datenzellen == Oldval [i]]: = Newval [i] } datacols } ' –