2015-04-13 11 views
5

Eine Dummy-Spalte für eine Spalte c und ein gegebener Wert x entspricht 1 wenn c==x und 0 sonst. Normalerweise wird beim Erstellen von Dummies für eine Spalte c ein Wert x bei der Auswahl ausgeschlossen, da die letzte Dummy-Spalte keine Informationen w.r.t. die bereits vorhandenen Dummy-Spalten.R: Warnung beim Erstellen einer (langen) Liste von Dummies

Hier ist, wie ich versuche, für eine Spalte firm, in einem data.table eine lange Liste von Attrappen zu erstellen:

values <- unique(myDataTable$firm) 
cols <- paste('d',as.character(inds[-1]), sep='_') # gives us nice d_value names for columns 
# the [-1]: I arbitrarily do not create a dummy for the first unique value 
myDataTable[, (cols):=lapply(values[-1],function(x)firm==x)] 

Dieser Code zuverlässig für frühere Spalten gearbeitet, die kleinen eindeutigen Wert hatte. jedoch firm größer:

tr(values) 
num [1:3082] 51560090 51570615 51603870 51604677 51606085 ... 

ich eine Warnung erhalten, wenn sie versuchen, die Spalten hinzufügen:

Warning message: 
    truelength (6198) is greater than 1000 items over-allocated (length = 36). See ?truelength. If you didn't set the datatable.alloccol option very large, please report this to datatable-help including the result of sessionInfo(). 

Soweit ich das beurteilen kann, gibt es noch alle Spalten, die ich brauche. Kann ich dieses Problem einfach ignorieren? Wird es zukünftige Berechnungen verlangsamen? Ich bin nicht sicher, was ich von diesem und dem relevanten von truelength machen soll.

+0

Geben Sie die Daten, nur ein Beispiel, verwenden Sie 'dput (myDataTable [1:10])'. ** Bearbeiten: ** sieht aus wie in Bezug auf die Größe der hinzuzufügenden Spalten, so dass Beispieldaten möglicherweise nicht einfach zu teilen sind. Haben Sie versucht, die erwähnte Option auf 'length (values)' zu setzen? – jangorecki

+2

6000+ Spalten?!? :-O. Lies '' truumlength' und benutze 'alloc.col' mit' n' Argument, um freie Slots für die Anzahl der Spalten zu erstellen, die du erstellst .. sonst wirst du die Warnung erhalten, weil wir jedes Mal, wenn du sparst, zu viel Speicherplatz reservieren müssen Slots sind aufgebraucht .. – Arun

+0

@Arun 'ncol (myDataTable)' gibt mir '[1] 3085', so dass die Nachricht keinen Sinn macht. Verstehe ich richtig, dass ich jedes Mal ineffizient bin, wenn ich einen riesigen Brocken von Spalten hinzufüge, für den ich nicht vorberechnet habe? In diesem Fall, da dies eine einzigartige Operation ist, denke ich, dass es mir gut geht. – FooBar

Antwort

2

Nehmen Aruns Kommentar als Antwort.
Sie sollten die alloc.col Funktion verwenden, um die erforderliche Anzahl von Spalten in Ihrer data.table auf die Anzahl vorzubelegen, die größer als erwartet sein wird ncol.

alloc.col(myDataTable, 3200) 

Zusätzlich auf dem Weg je nachdem, wie Sie die Daten verbrauchen würde ich empfehlen, Ihren breiten Tisch zu langen Tisch zu betrachten Umformung finden EAV. Dann brauchen Sie nur eine Spalte pro Datentyp.

Verwandte Themen