data.table
Aggiunta e modifica di colonne
Ricerca…
Osservazioni
La vignetta ufficiale, "Semantica di riferimento" , è la migliore introduzione a questo argomento.
Un promemoria: DT[where, select|update|do, by]
è usato per lavorare con le colonne di un data.table.
- La parte "dove" è l'argomento
i
- La parte "select | update | do" è l'argomento
j
Questi due argomenti vengono generalmente passati per posizione anziché per nome.
Tutte le modifiche alle colonne possono essere fatte in j
. Inoltre, la funzione set
è disponibile per questo uso.
Modifica dei valori
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Modifica di una colonna
Utilizza l'operatore :=
all'interno di j
per creare nuove colonne o modificare quelle esistenti:
DT[, mpg_sq := mpg^2]
Modifica su un sottoinsieme di righe
Utilizza l'argomento i
per sottoporre a sotto le righe "dove" devono essere apportate modifiche:
DT[1:3, newvar := "Hello"]
Come in un data.frame, possiamo impostare sottoinsiemi usando numeri di riga o test logici. È anche possibile usare [un "join" in i
quando si modifica] [need_a_link].
Rimozione di una colonna
Rimuovi colonne impostando su NULL
:
DT[, mpg_sq := NULL]
Notare che non <-
assegnare il risultato, poiché DT
è stato modificato sul posto.
Modifica di più colonne
Aggiungere più colonne tramite :=
formato multivariata dell'operatore:
DT[, `:=`(mpg_sq = mpg^2, wt_sqrt = sqrt(wt))]
# or
DT[, c("mpg_sq", "wt_sqrt") := .(mpg^2, sqrt(wt))]
La sintassi .()
Viene utilizzata quando il lato destro di LHS := RHS
è un elenco di colonne.
Modifica di più colonne dipendenti sequenzialmente
Se le colonne dipendono e devono essere definite in sequenza, alcuni modi per farlo sono:
DT[, c("mpg_sq", "mpg2_hp") := .(temp1 <- mpg^2, temp1/hp)]
# or
DT[, c("mpg_sq", "mpg2_hp") := {temp1 = mpg^2; .(temp1, temp1/hp)}]
Modifica di colonne con nomi determinati dinamicamente
Per i nomi di colonna determinati dinamicamente, utilizzare le parentesi:
vn = "mpg_sq"
DT[, (vn) := mpg^2]
Utilizzando set
Le colonne possono anche essere modificate con set
per una piccola riduzione del sovraccarico, anche se questo è raramente necessario:
set(DT, j = "hp_over_wt", v = mtcars$hp/mtcars$wt)
Riordinare le colonne
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Per riorganizzare l'ordine delle colonne, usa setcolorder
. Ad esempio, per invertirli
setcolorder(DT, rev(names(DT)))
Questo non costa quasi nulla in termini di prestazioni, dal momento che sta solo permettendo l'elenco dei puntatori di colonna nel data.table.
Rinominare le colonne
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Per rinominare una colonna (mantenendo i dati uguali), non è necessario copiare i dati in una colonna con un nuovo nome ed eliminare quello precedente. Invece, possiamo usare
setnames(DT, "mpg_sq", "mpq_squared")
per modificare la colonna originale per riferimento.
Modifica dei livelli dei fattori e altri attributi delle colonne
# example data
DT = data.table(iris)
Per modificare i livelli dei fattori per riferimento, usa setattr
:
setattr(DT$Species, "levels", c("set", "ver", "vir")
# or
DT[, setattr(Species, "levels", c("set", "ver", "vir"))]
La seconda opzione potrebbe stampare il risultato sullo schermo.
Con setattr
, evitiamo la copia di solito incontrata durante i levels(x) <- lvls
, ma salterà anche alcuni controlli, quindi è importante fare attenzione ad assegnare un vettore valido di livelli.