2016-06-04 11 views
5

Ho esaminato le esercitazioni e la documentazione, ma non ho capito come assegnare un vettore di valori per tutte le colonne a una riga esistente in un data.table.Assegnare un vettore a una specifica riga di tabella di dati esistente in R

parto da un vuoto data.table che ha già il numero corretto di colonne e righe:

dt <- data.table(matrix(nrow=10, ncol=5)) 

Ora calcolare alcuni valori per una fila di fuori del data.table e metterli in un vettore vec, e. g .:

vec <- rnorm(5) 

Come è possibile assegnare i valori di vec a e. g. la prima riga di data.table mentre si ottiene una buona prestazione (visto che voglio anche riempire le altre righe passo dopo passo)?

+0

Dal momento che si sta utilizzando 'data.table' per la ragione delle prestazioni (come indicato in commento ad una risposta qui sotto) Credo che l'aggiunta di nuovo (molti) le righe e ancora una volta è ** non ** efficiente a tutti dato che il' data.table' (come 'data.frame') è column store, non un row store (il che significa che ogni volta che si aggiunge una riga, è necessario accedere a posizioni diverse nella memoria). Qual è la ragione (algoritmo) che richiede l'aggiunta di righe? –

+0

Sto creando una tabella vuota molto grande (11 mila righe x 8 mila colonne) e sto facendo alcuni calcoli per creare un vettore che poi uso per riempire questa tabella riga per riga. Pensavo che l'uso di data.table potesse renderlo più veloce rispetto a quando avessi usato una matrice o un dataframe. – Pascal

+0

OK, penso che 'data.table' sia più veloce utilizzandolo in questo modo poiché si prealloca la memoria richiesta (dimensione della tabella) e si sovrascrivono le righe per riferimento (se si utilizza la risposta di Richard con l'operatore': = ') poiché questo la soluzione NON copia l'intero dato solo perché si modifica un valore. Posso modificare la tua domanda per chiarire il caso d'uso esatto? –

risposta

8

Per prima cosa è necessario ottenere i tipi di colonna corretti, poiché la matrice NA creata è logica. I tipi di colonna non saranno magicamente modificati assegnando loro dei numeri.

dt[, names(dt) := lapply(.SD, as.numeric)] 

Quindi è possibile modificare i valori del primo fila con

dt[1, names(dt) := as.list(vec)] 

Detto questo, se si inizia con una matrice numerica non dovrebbe cambiare i tipi di colonna.

dt <- data.table(matrix(numeric(), 10, 5)) 
dt[1, names(dt) := as.list(vec)] 
Problemi correlati