Ich versuche, einen data.frame ohne Zeilen zu initialisieren. Grundsätzlich möchte ich die Datentypen für jede Spalte angeben und benennen, aber keine Zeilen als Ergebnis erstellen lassen.
Das Beste, was ich bisher tun konnte, ist so etwas wie:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Dadurch wird ein data.frame mit einer einzelnen Zeile erstellt, die alle von mir gewünschten Datentypen und Spaltennamen enthält, aber auch eine nutzlose Zeile erstellt, die dann entfernt werden muss.
Gibt es einen besseren Weg, dies zu tun?
data.frame
's haben Spalten eingegeben, also ja, wenn Sie eine initialisieren möchten,data.frame
müssen Sie den Typ der Spalten entscheiden ...data.frame
ist die "Primitivität" der Spaltentypen nicht wirklich einschränkend (Sie können beispielsweise eine Spalte mit Datumsangaben oder sogar eine Spalte mit einer Liste von Elementen hinzufügen). Diese Frage ist auch keine absolute Referenz, da Sie beispielsweise, wenn Sie nicht den richtigen Spaltentyp angeben, keine weitere Zeilenaddition mit Spalten unterschiedlichen Typs blockieren. Ich werde also eine Notiz hinzufügen, aber nicht Ein Beispiel mit allen primitiven Typen, da es nicht alle Möglichkeitendata.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Wenn Sie bereits einen vorhandenen Datenrahmen haben , der beispielsweise
df
die gewünschten Spalten enthält, können Sie einfach einen leeren Datenrahmen erstellen, indem Sie alle Zeilen entfernen:Beachten Sie, dass
df
die Daten weiterhin enthalten sind, dies jedochempty_df
nicht.Ich habe diese Frage auf der Suche nach einer neuen Instanz mit leeren Zeilen gefunden, daher denke ich, dass sie für einige Leute hilfreich sein könnte.
quelle
df[NA,]
dies auch auf den Index aus (was wahrscheinlich nicht das ist, was Sie wollen), würde ich stattdessen verwendendf[TRUE,] = NA
; Beachten Sie jedoch, dass dadurch das Original überschrieben wird. Sie müssen zuerst den Datenrahmen kopierencopy_df = data.frame(df)
und danncopy_df[TRUE,] = NA
empty_df
mit hinzufügenempty_df[0:nrow(df),] <- NA
.Sie können dies tun, ohne Spaltentypen anzugeben
quelle
Sie können
read.table
eine leere Zeichenfolge für die Eingabetext
wie folgt verwenden:Alternativ können Sie das
col.names
als Zeichenfolge angeben:Vielen Dank an Richard Scriven für die Verbesserung
quelle
read.table(text = "", ...)
Sie müssen keine Verbindung explizit öffnen.read.csv
Ansatz funktioniert auch mitreadr::read_csv
, wie inread_csv("Date,File,User\n", col_types = "Dcc")
. Auf diese Weise können Sie direkt ein leeres Tibble der erforderlichen Struktur erstellen.Der effizienteste Weg, dies zu tun, besteht
structure
darin, eine Liste mit der Klasse zu erstellen"data.frame"
:Um dies im Vergleich zur derzeit akzeptierten Antwort ins rechte Licht zu rücken, hier ein einfacher Maßstab:
quelle
data.table
is enthält normalerweise ein.internal.selfref
Attribut, das nicht gefälscht werden kann, ohne diedata.table
Funktionen aufzurufen . Sind Sie sicher, dass Sie sich hier nicht auf ein undokumentiertes Verhalten verlassen?data.table
und habe angenommen, dass Google gefunden hat, was ich wollte, und alles hier hängt damit zusammendata.table
.data.frame()
bietet Überprüfungen von Namen, Rownamen usw.Einfach deklarieren
Wenn Sie versuchen, in
rbind
die erste Zeile zu gelangen, werden die Spalten erstelltquelle
rbind
würde dies gut funktionieren, wenn nicht ...rbind()
.Wenn Sie nach Kürze suchen:
Sie müssen die Spaltennamen also nicht separat angeben. Sie erhalten den Standardspaltentyp logisch, bis Sie den Datenrahmen füllen.
quelle
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Ich habe einen leeren Datenrahmen mit folgendem Code erstellt
und versuchte, einige Zeilen zu binden, um das gleiche wie folgt zu füllen.
Es wurden jedoch folgende falsche Spaltennamen angegeben
Die Lösung hierfür besteht darin, newrow wie folgt in den Typ df umzuwandeln
Gibt jetzt den korrekten Datenrahmen an, wenn er wie folgt mit Spaltennamen angezeigt wird
quelle
Übergeben Sie zum Erstellen eines leeren Datenrahmens die Anzahl der benötigten Zeilen und Spalten an die folgende Funktion:
Um einen leeren Frame zu erstellen, während Sie die Klasse jeder Spalte angeben , übergeben Sie einfach einen Vektor der gewünschten Datentypen an die folgende Funktion:
Verwenden Sie wie folgt:
Welches gibt:
Führen Sie die folgenden Schritte aus, um Ihre Auswahl zu bestätigen:
quelle
Wenn Sie einen leeren data.frame mit dynamischen Namen (Spaltennamen in einer Variablen) erstellen möchten, kann dies helfen:
Sie können die Typen auch ändern, wenn Sie dies benötigen. mögen:
quelle
Wenn es Ihnen nichts ausmacht, Datentypen nicht explizit anzugeben, können Sie dies folgendermaßen tun:
quelle
Mit Using können
data.table
wir Datentypen für jede Spalte angeben.quelle
Wenn Sie eine solche
data.frame
mit vielen Spalten deklarieren möchten , ist es wahrscheinlich schwierig, alle Spaltenklassen manuell einzugeben. Insbesondere wenn Sie davon Gebrauch machen können,rep
ist dieser Ansatz einfach und schnell (ungefähr 15% schneller als die andere Lösung, die so verallgemeinert werden kann):Wenn sich Ihre gewünschten Spaltenklassen in einem Vektor befinden
colClasses
, können Sie Folgendes tun:lapply
führt zu einer Liste der gewünschten Länge, von der jedes Element einfach ein leerer typisierter Vektor wienumeric()
oder istinteger()
.setDF
konvertiert dieslist
unter Bezugnahme auf adata.frame
.setnames
fügt die gewünschten Namen als Referenz hinzu.Geschwindigkeitsvergleich:
Es ist auch schneller als
structure
auf ähnliche Weise:quelle
Angenommen, Ihre Spaltennamen sind dynamisch. Sie können eine leere Matrix mit Zeilennamen erstellen und in einen Datenrahmen umwandeln.
quelle
Diese Frage ging nicht speziell auf meine Bedenken ein ( hier beschrieben ), aber falls jemand dies mit einer parametrisierten Anzahl von Spalten und ohne Zwang tun möchte:
Wie Divibisan zu der damit verbundenen Frage feststellt,
quelle
Wenn Sie bereits einen Datenrahmen haben, können Sie die Metadaten (Spaltennamen und -typen) aus einem Datenrahmen extrahieren (z. B. wenn Sie einen BUG steuern, der nur mit bestimmten Eingaben ausgelöst wird und einen leeren Dummy-Datenrahmen benötigt):
Verwenden Sie dann die
read.table
, um den leeren Datenrahmen zu erstellenquelle