valori È possibile modificare un data.frame sul posto(in modo distruttivo)?



sostituire valori in r (1)

Sembra che si possa aggiungere / eliminare una colonna in un data.table sul posto , cioè senza copiare tutte le altre colonne in una nuova tabella.

È possibile farlo con una vanilla data.frame ?

PS. So come aggiungere / eliminare colonne "funzionalmente", cioè creare un nuovo frame senza modificare quello originale.


È possibile eliminare o modificare una colonna esistente da un data.frame per riferimento con data.table::set . Dubito che tu possa aggiungere una colonna senza fare una copia. Il motivo per cui è possibile aggiungere una colonna a data.table senza fare una copia è data.table la memoria. Vedi ?alloc.col per altro.

R> library(data.table)
R> data(mtcars)
R> tracemem(mtcars)
[1] "<0x59fef68>"
R> set(mtcars, j="mpg", value=NULL)        # remove a column
R> set(mtcars, j="cyl", value=rep(42, 32)) # modify a column
R> untracemem(mtcars)
R> str(mtcars)
'data.frame':   32 obs. of  10 variables:
 $ cyl : num  42 42 42 42 42 42 42 42 42 42 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Confrontalo con le normali operazioni data.frame

R> data(mtcars)
R> tracemem(mtcars)
[1] "<0x6b3ec30>"
R> mtcars[, "mpg"] <- NULL
tracemem[0x6b3ec30 -> 0x84de0c8]: 
tracemem[0x84de0c8 -> 0x84de410]: [<-.data.frame [<- 
tracemem[0x84de410 -> 0x84de6b0]: [<-.data.frame [<- 
R> tracemem(mtcars)
[1] "<0x84dca30>"
R> mtcars[, "cyl"] <- rep(42, 32)
tracemem[0x84dca30 -> 0x84dcc28]: 
tracemem[0x84dcc28 -> 0x84dd018]: [<-.data.frame [<- 
tracemem[0x84dd018 -> 0x84dff70]: [<-.data.frame [<- 
R> untracemem(mtcars)
R> data(mtcars)




data.table