2015-04-13 9 views
5

Una colonna fittizia per una colonna c e un valore dato x equivale a 1 se c==x e 0 altro. Di solito, creando dei manichini per una colonna c, si esclude un valore x a scelta, poiché l'ultima colonna fittizia non aggiunge alcuna informazione w.r.t. le colonne fittizie già esistenti.R: avviso durante la creazione di un (lungo) elenco di manichini

Ecco come sto cercando di creare una lunga lista di manichini per una colonna firm, in un data.table:

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)] 

Questo codice ha funzionato in modo affidabile per le colonne precedenti, che avevano valori unici minori. firm però è più grande:

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

Ho ricevuto un avviso quando si cerca di aggiungere le colonne:

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(). 

Per quanto posso dire, c'è ancora tutte le colonne che ho bisogno. Posso semplicemente ignorare questo problema? Rallenterà i calcoli futuri? Non sono sicuro di cosa fare di questo e del relativo di truelength.

+0

Fornire i dati, solo un esempio, utilizzare 'dput (myDataTable [1:10])'. ** Modifica: ** sembra correlato alla dimensione delle colonne da aggiungere, quindi i dati di esempio potrebbero non essere facili da condividere. Hai provato a impostare l'opzione menzionata a 'length (values)'? – jangorecki

+2

Oltre 6000 colonne?!? : -O. Leggi '' truelength' e usa 'alloc.col' con l'argomento' n' per far crescere gli slot di riserva su quante colonne hai mai creato .. altrimenti riceverai l'avviso perché dobbiamo sovra-allocare ogni volta di riserva gli slot sono esauriti .. – Arun

+0

@Arun 'ncol (myDataTable)' mi dà '[1] 3085', quindi quel messaggio non ha molto senso. Ho capito correttamente che sono inefficiente ogni volta che aggiungo un'enorme quantità di colonne per le quali non ho preallocato? In tal caso, trattandosi di un'operazione unica, suppongo di star bene. – FooBar

risposta

2

Prendere il commento di Arun come risposta.
È necessario utilizzare la funzione alloc.col per pre-allocare la quantità richiesta di colonne nel proprio data.table al numero che sarà maggiore del previsto ncol.

alloc.col(myDataTable, 3200) 

Inoltre a seconda del modo in cui si consumano i dati mi sento di raccomandare di prendere in considerazione rimodellare ampio tavolo per lungo tavolo, vedere EAV. Quindi è necessario disporre di una sola colonna per tipo di dati.

Problemi correlati