Ich habe einen großen Datensatz und möchte bestimmte Spalten lesen oder alle anderen löschen.
data <- read.dta("file.dta")
Ich wähle die Spalten aus, die mich nicht interessieren:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
und dann möchte ich so etwas machen wie:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
um alle unerwünschten Spalten zu löschen. Ist das die optimale Lösung?
subset(data, select=c(...))
in meinem Fall hilft, Vars fallen zu lassen. Die Frage betraf jedoch hauptsächlich denpaste("data$",var.out[i],sep="")
Teil für den Zugriff auf interessierende Spalten innerhalb der Schleife. Wie kann ich einen Spaltennamen einfügen oder irgendwie zusammensetzen? Vielen Dank an alle für Ihre Aufmerksamkeit und Ihre HilfeAntworten:
Sie sollten entweder die Indizierung oder die
subset
Funktion verwenden. Zum Beispiel :Dann können Sie die
which
Funktion und den-
Operator bei der Spaltenindizierung verwenden:Oder, viel einfacher, verwenden Sie das
select
Argument dersubset
Funktion: Sie können den-
Operator dann direkt für einen Vektor von Spaltennamen verwenden und sogar die Anführungszeichen um die Namen weglassen!Beachten Sie, dass Sie auch die gewünschten Spalten auswählen können, anstatt die anderen zu löschen:
quelle
select
Argument dersubset
Funktion hat den Job perfekt gemacht! Danke juba!which
ist nicht notwendig, siehe Istas Antwort. Aber die Teilmenge mit-
ist schön! Wusste das nicht!subset
sieht gut aus, aber die Art und Weise, wie fehlende Werte lautlos gelöscht werden, scheint mir ziemlich gefährlich zu sein.subset
ist in der Tat sehr praktisch, aber denken Sie daran, es nicht zu verwenden, es sei denn, Sie verwenden R interaktiv. Weitere Informationen finden Sie in der Warnung in der Funktionsdokumentation und in dieser SO-Frage .Nicht dafür verwenden
-which()
, es ist extrem gefährlich. Erwägen:Verwenden Sie stattdessen die Teilmenge oder die
!
Funktion:Ich habe dies aus schmerzhaften Erfahrungen gelernt. Nicht überbeanspruchen
which()
!quelle
setdiff
ist auch nützlich:setdiff(names(dat), c("foo", "bar"))
setdiff
Vorschlag von @hadley eignet sich sehr gut für lange Namenslisten.Erstens können Sie die direkte Indizierung (mit Booleschen Vektoren) verwenden, anstatt erneut auf Spaltennamen zuzugreifen, wenn Sie mit demselben Datenrahmen arbeiten. Wie Ista betont, ist es sicherer und schneller zu schreiben und auszuführen. Sie brauchen also nur:
und dann einfach Daten neu zuweisen:
Zweitens können Sie schneller zu schreiben den Spalten, die Sie entfernen möchten, direkt NULL zuweisen:
Schließlich können Sie subset () verwenden, es kann jedoch nicht wirklich im Code verwendet werden (selbst die Hilfedatei warnt davor). Insbesondere besteht für mich ein Problem darin, dass Sie den Ausdruck, der den Spaltennamen entspricht, ohne Anführungszeichen schreiben müssen, wenn Sie die Drop-Funktion von susbset () direkt verwenden möchten:
Als Bonus gibt es hier einen kleinen Benchmark der verschiedenen Optionen, der deutlich zeigt, dass die Teilmenge langsamer und die erste Methode zur Neuzuweisung schneller ist:
Code ist unten:
quelle
NULL
, aber warum ist es notwendig, wenn Sie mehr als zwei Namen eingeben, um sie zuzuweisenlist(NULL)
? Ich bin nur neugierig zu wissen, wie es funktioniert, weil ich es mit nur einem Namen versucht habe und es nicht brauchelist()
$
oder[[
) zugreifen , führt die Verwendung<- list(NULL)
tatsächlich zu falschen Ergebnissen. Wenn Sie mit einer oder mehreren Spalten auf eine Teilmenge des Datenrahmens zugreifen,<- list(NULL)
ist dies der richtige Weg, auch wenn dieser für einen einspaltigen Datenrahmen nicht benötigt wird (da erdf['myColumns']
bei Bedarf in einen Vektor umgewandelt wird).Sie können das
dplyr
Paket auch ausprobieren :quelle
dplyr::select(df2, -one_of(c('x','y')))
funktioniert weiterhin (mit einer Warnung), auch wenn einige der genannten Spalten nicht vorhanden sindHier ist eine schnelle Lösung dafür. Angenommen, Sie haben einen Datenrahmen X mit drei Spalten A, B und C:
Wenn ich eine Spalte entfernen möchte, z. B. B, verwenden Sie einfach grep für Spaltennamen, um den Spaltenindex abzurufen, mit dem Sie die Spalte weglassen können.
Ihr neuer X-Datenrahmen würde folgendermaßen aussehen (diesmal ohne die B-Spalte):
Das Schöne an grep ist, dass Sie mehrere Spalten angeben können, die dem regulären Ausdruck entsprechen. Wenn ich X mit fünf Spalten hätte (A, B, C, D, E):
Nehmen Sie die Spalten B und D heraus:
EDIT: In Anbetracht des Grepl-Vorschlags von Matthew Lundberg in den Kommentaren unten:
Wenn ich versuche, eine nicht vorhandene Spalte zu löschen, sollte nichts passieren:
quelle
X[,-grep("B",colnames(X))]
gibt keine Spalten zurück, wenn kein Spaltenname enthalten istB
, anstatt alle Spalten wie gewünscht zurückzugeben. Betrachten Sie mitX <- iris
für ein Beispiel. Dies ist das Problem bei der Verwendung negativer Indizes mit berechneten Werten. Betrachten Siegrepl
stattdessen.Ich habe versucht, eine Spalte zu löschen, während ich das Paket verwendet habe,
data.table
und habe ein unerwartetes Ergebnis erhalten. Ich denke, das Folgende könnte es wert sein, veröffentlicht zu werden. Nur ein kleiner Warnhinweis.[Herausgegeben von Matthew ...]
Grundsätzlich ist die Syntax für
data.table
NICHT genau die gleiche wiedata.frame
. Tatsächlich gibt es viele Unterschiede, siehe FAQ 1.1 und FAQ 2.17. Du wurdest gewarnt!quelle
DT[,var.out := NULL]
gewünschten Spalten löschen.data.frame
als auch fürdata.table
KlassenIch habe den Code geändert in:
Wie auch immer, Jubas Antwort ist die beste Lösung für mein Problem!
quelle
select
Argument dersubset
Funktion in meinem Code. Ich wollte nur sehen, wie ich auf beliebige Spalten in einer Schleife zugreifen kann, falls ich etwas anderes tun möchte, als nur die Spalte zu löschen. Der ursprüngliche Datensatz hat ungefähr 1200 Vars und ich bin nur daran interessiert, 4 davon zu verwenden, ohne zu wissen, wo genau sie sich befinden.Hier ist eine andere Lösung, die für andere hilfreich sein kann. Der folgende Code wählt eine kleine Anzahl von Zeilen und Spalten aus einem großen Datensatz aus. Die Spalten werden wie in einer der Antworten von juba ausgewählt, außer dass ich eine Einfügefunktion verwende, um eine Reihe von Spalten mit Namen auszuwählen, die fortlaufend nummeriert sind:
quelle
quelle
Ich kann Ihre Frage in den Kommentaren aufgrund der geringen Reputation nicht beantworten.
Der nächste Code gibt einen Fehler aus, da die Einfügefunktion eine Zeichenfolge zurückgibt
Hier ist eine mögliche Lösung:
oder einfach machen:
quelle
dfnum = df[,-c(8,9)]
quelle