Wie lösche ich eine Zeile als Referenz in data.table?
Meine Frage ist in Bezug auf die Zuordnung von Referenz-versus kopieren in data.table
. Ich möchte wissen, ob man Zeilen löschen von Referenz, ähnlich
DT[ , someCol := NULL]
Ich will wissen, über
DT[someRow := NULL, ]
Denke ich, es gibt einen guten Grund, warum diese Funktion nicht vorhanden ist, so könnte man vielleicht einfach zeigen, eine gute alternative zu den üblichen Kopier-Ansatz, wie unten beschrieben. Insbesondere, gehen mit mein Lieblings-Beispiel(Daten.Tabelle),
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
Sagen, ich will löschen Sie die erste Zeile aus dieser Daten.Tabelle. Ich weiß, ich kann dies tun:
DT <- DT[-1, ]
aber oft können wir vermeiden wollen, dass, weil wir kopieren das Objekt (und das erfordert etwa 3*N Speicher, wenn N object.size(DT)
wie schon hier.
Jetzt fand ich set(DT, i, j, value)
. Ich weiß, wie ich bestimmte Werte (wie hier: setzt alle Werte in den Zeilen 1 und 2, sowie den Spalten 2 und 3 zu 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 das löschen der ersten beiden Zeilen sagen? Dabei
set(DT, 1:2, 1:3, NULL)
legt die gesamte DT zu NULL.
Mein SQL-wissen ist sehr begrenzt, so dass Sie Jungs sagen mir: die angegebenen Daten.Tabelle mit SQL Technologien, gibt es ein äquivalent zu der SQL-Befehl
DELETE FROM table_name
WHERE some_column=some_value
Daten.Tabelle?
InformationsquelleAutor der Frage Florian Oswald | 2012-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Frage.
data.table
können Sie nicht löschen von Zeilen, die durch Verweis noch.data.table
hinzufügen und löschen können Spalten durch Referenz, da es über-weist der Vektor der Spalte Zeiger, wie Sie wissen. Der plan, etwas ähnliches zu tun für die Zeilen und ermöglichen eine schnelleinsert
unddelete
. Eine Zeile löschen verwenden würdememmove
in C von der Stelle zu rühren, bis die Elemente (in jeder Spalte) nach der gelöschten Zeilen. Löschen einer Zeile in der Mitte der Tabelle wäre immer noch ziemlich ineffizient im Vergleich zu einer Zeile store-Datenbank wie SQL, das ist mehr geeignet für das schnelle einfügen und löschen von Zeilen, wo die Zeilen in der Tabelle. Aber trotzdem, es wäre viel schneller als das kopieren einer neuen großen Objekt ohne die gelöschten Zeilen.Auf der anderen Seite, da Spalte Vektoren wäre überlastet, werden die Zeilen eingefügt werden könnte (und gelöscht) am Endesofort; z.B., ein wachsender Zeit-Serie.
InformationsquelleAutor der Antwort Matt Dowle
den Ansatz, den ich genommen habe um den Speicher nutzen, ähnlich wie in-place-Löschung ist Teilmenge einer Spalte zu einer Zeit und löschen. nicht so schnell wie eine richtige C memmove Lösung, aber Speicher verwenden, ist alles, was ich hier kümmern. so etwas wie dieses:
InformationsquelleAutor der Antwort vc273
Hier ist eine funktionierende Funktion basierend auf @vc273 Antwort und @Frank s feedback.
Beispiel für die Verwendung:
Wo "dat" ist eine Daten.Tabelle. Entfernen 14k Zeilen von 1,4 M Zeilen dauert 0,25 sec auf meinem laptop.
PS. Da ich neu bin, SO konnte ich nicht hinzufügen, Kommentar zu @vc273 s thread 🙁
InformationsquelleAutor der Antwort Jarno P.
Statt oder der Versuch, auf NULL gesetzt, versuchen Sie, zu NA (passend zu den NA-Typ für die erste Spalte)
InformationsquelleAutor der Antwort 42-
Das Thema ist immer noch interessant, viele Menschen (mich eingeschlossen).
Was ist das? Ich verwendet
assign
zu ersetzen, dieglovalenv
und der code zuvor beschrieben. Besser wäre es, zu erfassen, die ursprüngliche Umgebung, aber zumindest imglobalenv
es ist Speicher effizient und wirkt wie eine änderung von ref.InformationsquelleAutor der Antwort JRR
Hier sind einige Strategien, die ich verwendet habe. Ich glaube, dass ein .ZEILE Funktion kommen können. Keiner dieser Ansätze sind unten schnell. Diese sind einige Strategien, die ein wenig über Teilmengen oder filtern. Ich habe versucht zu denken, wie dba, nur versuchen zu bereinigen, die Daten. Wie oben erwähnt, können Sie wählen Sie oder entfernen von Zeilen in Daten.Tabelle:
Hinweis: .SD erstellt, die eine Teilmenge der ursprünglichen Daten und können Sie einiges an Arbeit in j oder nachfolgenden Daten.Tabelle. Sehen https://stackoverflow.com/a/47406952/305675. Hier bestellte ich meine Iris durch Kelchblatt Länge, nehmen eine angegebene Kelchblatt.Länge als minimum,wählen Sie die top drei (von Kelchblatt Länge) aller Arten und zurück alle begleitenden Daten:
Die Ansätze vor allem erneut ein Daten.Tabelle sequentiell beim entfernen von Zeilen. Sie können die transpose-Daten.Tabelle und entfernen oder ersetzen Sie die alten Zeilen, die jetzt umgesetzt Spalten. Bei der Verwendung von ':=NULL' zu entfernen, umgesetzt Zeile, die nachfolgenden Spaltennamen um entfernt:
Wenn du die Daten transponieren.die Rückseite des Rahmens, um eine Daten.Tabelle, können Sie umbenennen möchten, aus den ursprünglichen Daten.Tisch und wiederherstellen der Attribute der Klasse, bei der Löschung. Die Anwendung von": = "NULL" zu einem jetzt umgesetzt Daten.- Tabelle erstellt, alle Charakter-Klassen.
Können Sie nur wollen, entfernen Sie doppelte Zeilen, die Sie tun können, mit oder ohne Schlüssel:
Ist es auch möglich, einen inkrementellen Zähler mit '.I'. Dann können Sie suchen doppelte keys oder Felder, und entfernen Sie diese durch entfernen des Datensatzes mit dem Zähler. Dies ist rechnerisch teuer, aber hat einige Vorteile, denn Sie können drucken, die Zeilen entfernt werden.
Können Sie auch füllen Sie eine Zeile mit 0EN oder NAs, und verwenden Sie dann eine, die ich Abfrage, um Sie zu löschen:
InformationsquelleAutor der Antwort rferrisx