Um eine Spalte mit dem Namen "foo" in a loszuwerden data.frame
, kann ich Folgendes tun:
df <- df[-grep('foo', colnames(df))]
Sobald df
es jedoch in ein data.table
Objekt konvertiert wurde , gibt es keine Möglichkeit, nur eine Spalte zu entfernen.
Beispiel:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
Sobald es jedoch in ein data.table
Objekt konvertiert wurde, funktioniert dies nicht mehr.
r
data.table
Maiasaura
quelle
quelle
dt
zu benennen, anstattdf3
...Antworten:
Mit einer der folgenden
foo
Optionen wird die Spalte aus der Datentabelle entferntdf3
:data.table unterstützt auch die folgende Syntax:
obwohl , wenn Sie es fehlte eigentlich Spalte zu entfernen ,
"foo"
ausdf3
(im Gegensatz zu nur einen Blick auf den Druckdf3
minus Spalte"foo"
) Sie wirklich verwenden Methode 1 stattdessen wollen würde.(Beachten Sie, dass Sie, wenn Sie eine Methode verwenden, die auf
grep()
odergrepl()
basiert, festlegen müssen,pattern="^foo$"
anstatt"foo"
, dass Spalten mit Namen wie"fool"
und"buffoon"
(dh solche, diefoo
als Teilzeichenfolge enthalten) ebenfalls abgeglichen und entfernt werden sollen.)Weniger sichere Optionen, gut für den interaktiven Gebrauch:
Die nächsten beiden Redewendungen funktionieren ebenfalls - wenn sie
df3
eine Spaltenübereinstimmung enthalten"foo"
-, schlagen jedoch auf wahrscheinlich unerwartete Weise fehl, wenn dies nicht der Fall ist. Wenn Sie beispielsweise eine davon verwenden, um nach der nicht vorhandenen Spalte zu suchen"bar"
, erhalten Sie eine Datentabelle mit null Zeilen.Infolgedessen eignen sie sich am besten für die interaktive Verwendung, bei der beispielsweise eine Datentabelle ohne Spalten mit Namen angezeigt werden soll, die den Teilstring enthalten
"foo"
. Für Programmierzwecke (oder wenn Sie die Spalte (n) tatsächlichdf3
aus einer Kopie entfernen möchten, anstatt aus einer Kopie davon) sind die Methoden 1, 2a und 2b wirklich die besten Optionen.Schließlich gibt es Ansätze
with=FALSE
,data.table
die dieses Argument verwenden , sich jedoch allmählich von der Verwendung dieses Arguments entfernen, sodass jetzt davon abgeraten wird, wo Sie es vermeiden können. Hier anzeigen, damit Sie wissen, dass die Option vorhanden ist, falls Sie sie wirklich benötigen:quelle
-grep
versus!grepl
.grepl()
habe es ursprünglich versucht und es hat nicht funktioniert, da data.table-Spalten nicht durch einen logischen Vektor indiziert werden können. Aber jetzt ist mir klar, dassgrepl()
dies durch Umbrechen zum Funktionieren gebracht werden kannwhich()
, sodass ein ganzzahliger Vektor zurückgegeben wird.data.table
, aber eswhich
ist klug, es einzuwickeln!data.table
; FR # 1797 hinzugefügt . Methode 1 ist jedoch (fast) unendlich schneller als die anderen. Methode 1 entfernt die Spalte als Referenz ohne Kopie. Ich bezweifle, dass Sie es für Daten jeder Größe über 0,005 Sekunden erhalten. Im Gegensatz dazu funktionieren die anderen möglicherweise überhaupt nicht, wenn sich die Tabelle in der Nähe von 50% des Arbeitsspeichers befindet, da sie alle außer der zu löschenden kopieren.Sie können dies auch verwenden,
set
um den Overhead von[.data.table
in-Schleifen zu vermeiden :Wenn Sie es nach Spaltennamen tun möchten,
which(colnames(dt) %in% c("a","c","e"))
sollte für funktionierenj
.quelle
data.table
1.11.8, wenn Sie es nach Spaltennamen tun möchten, können Sie direktrm.col = c("a","b")
unddt[, (rm.col):=NULL]
Ich mache es einfach im Datenrahmen:
Funktioniert schnell und verursacht, soweit ich sehen konnte, keine Probleme.
UPDATE: Nicht die beste Methode, wenn Ihr DT sehr groß ist, da die Verwendung des
$<-
Operators zum Kopieren von Objekten führt. Also besser nutzen:quelle
Sehr einfache Option für den Fall, dass Sie viele einzelne Spalten in einer Datentabelle löschen müssen und nicht alle Spaltennamen #careadviced eingeben möchten
Dadurch werden stattdessen Spalten basierend auf der Spaltennummer entfernt.
Es ist offensichtlich nicht so effizient, weil es die Vorteile von data.table umgeht, aber wenn Sie mit weniger als 500.000 Zeilen arbeiten, funktioniert es einwandfrei
quelle
Angenommen , Ihre dt Spalten hat
col1
,col2
,col3
,col4
,col5
,coln
.So löschen Sie eine Teilmenge davon:
quelle
Hier ist eine Möglichkeit, wenn Sie eine Anzahl von Spalten auf NULL setzen möchten, da deren Spaltennamen eine Funktion für Ihre Verwendung sind :)
quelle
quelle
Wenn Sie für eine data.table die Spalte NULL zuweisen, wird sie entfernt:
... was entspricht:
Das Äquivalent für einen data.frame lautet:
F. Warum enthält die Version für data.table ein Komma und in der Version für data.frame kein Komma?
A. Da data.frames als Liste von Spalten gespeichert werden, können Sie das Komma überspringen. Sie können es auch hinzufügen, aber dann müssen Sie sie einer Liste von
NULL
s ,DF[, c("col1", "col2", "col3")] <- list(NULL)
.quelle
data.frames
in der die Zeilen und Spalten gewechselt würden. Das wäre unlogisch.DF[column,row]
Ich wollte nur sehen, ob es tatsächlich Fälle gibt, in denen dies passiert ist.