Meine Frage bezieht sich auf die Zuweisung durch Referenz oder das Kopieren in data.table
. Ich möchte wissen, ob man Zeilen durch Referenz löschen kann, ähnlich wie
DT[ , someCol := NULL]
Ich möchte es wissen
DT[someRow := NULL, ]
Ich denke, es gibt einen guten Grund, warum diese Funktion nicht existiert. Vielleicht können Sie einfach eine gute Alternative zum üblichen Kopieransatz aufzeigen, wie unten. Insbesondere mit meinem Favoriten aus Beispiel (data.table),
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Angenommen, ich möchte die erste Zeile aus dieser Datentabelle löschen. Ich weiß, ich kann dies tun:
DT <- DT[-1, ]
aber oft möchten wir das vermeiden, weil wir das Objekt kopieren (und das erfordert ungefähr 3 * N Speicher, wenn N object.size(DT)
, wie hier ausgeführt . Jetzt habe ich gefunden set(DT, i, j, value)
. Ich weiß, wie man bestimmte Werte setzt (wie hier: setze alle Werte in den Zeilen 1 und 2 und den Spalten 2 und 3 bis Null)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Aber wie kann ich beispielsweise die ersten beiden Zeilen löschen? Tun
set(DT, 1:2, 1:3, NULL)
setzt den gesamten DT auf NULL.
Meine SQL-Kenntnisse sind sehr begrenzt, also sagt ihr mir: Wenn data.table SQL-Technologie verwendet, gibt es eine Entsprechung zum SQL-Befehl
DELETE FROM table_name
WHERE some_column=some_value
in data.table?
DT[ , keep := .I > 1]
dann eine Teilmenge für spätere Operationen: DT[(keep), ...]
vielleicht sogar setindex(DT, keep)
die Geschwindigkeit dieser Teilmenge. Kein Allheilmittel, aber es lohnt sich, es als Design-Wahl in Ihrem Workflow zu betrachten. Möchten Sie wirklich alle diese Zeilen aus dem Speicher löschen oder möchten Sie sie lieber ausschließen? Die Antwort unterscheidet sich je nach Anwendungsfall.
data.table()
SQL-Technologie so sehr verwendet wird, als dass man eine Parallele zwischen den verschiedenen Operationen in SQL und den verschiedenen Argumenten zu a ziehen kanndata.table
. Für mich impliziert der Verweis auf "Technologie" etwas, dass erdata.table
irgendwo auf einer SQL-Datenbank sitzt, was AFAIK nicht der Fall ist.