Dal <-.data.table
non fa una copia, è possibile utilizzare <-
:
Creare un oggetto data.table:
library(data.table)
di <- data.table(iris)
creare una nuova colonna:
di <- di[, z:=1:nrow(di)]
di
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species z
# [1,] 5.1 3.5 1.4 0.2 setosa 1
# [2,] 4.9 3.0 1.4 0.2 setosa 2
# [3,] 4.7 3.2 1.3 0.2 setosa 3
# [4,] 4.6 3.1 1.5 0.2 setosa 4
# [5,] 5.0 3.6 1.4 0.2 setosa 5
# [6,] 5.4 3.9 1.7 0.4 setosa 6
# [7,] 4.6 3.4 1.4 0.3 setosa 7
# [8,] 5.0 3.4 1.5 0.2 setosa 8
# [9,] 4.4 2.9 1.4 0.2 setosa 9
# [10,] 4.9 3.1 1.5 0.1 setosa 10
# First 10 rows of 150 printed.
Vale anche la pena di ricordare che R stampa solo il valore di un oggetto in interattivo e modalità.
Quindi, in modalità batch, si può semplicemente utilizzare:
di[, z:=1:nrow(di)]
Questo non produrrà alcun output quando viene eseguito come uno script in modalità batch.
Maggiori informazioni del Matthew Dowle:
vedere anche FAQ 2.21 e 2.22:
2,21 Perché il DT[i,col:=value]
restituire l'intera DT
? Mi aspettavo un valore non visibile (coerente con <-
) o un messaggio o un valore di ritorno contenente il numero di righe aggiornate. Non è ovvio che i dati siano stati effettivamente aggiornati per riferimento.
In modo che la sintassi composta possa funzionare; ad es., DT[i,done:=TRUE][,sum(done)]
. Il numero di righe aggiornate viene restituito quando la verbosità è attiva, su base per query o globalmente utilizzando options(datatable.verbose=TRUE)
.
2.22 Ok, ma non è possibile restituire il valore restituito di DT[i,col:=value]
in modo invisibile, quindi?
- abbiamo provato a ma R costringe internamente visibilità per
[
. Il valore di colonna eval di FunTab (vedere src/main/names.c) per [
è 0
indicando la forza R_Visible
(consultare la sezione R-Internals 1.6). Pertanto, quando abbiamo provato invisible()
o impostando R_Visible
a 0
direttamente noi stessi, eval
in src/main/eval.c lo forza nuovamente.
- Dopo essersi abituato a questo comportamento, si potrebbe crescere per preferirlo (abbiamo). Dopotutto, quante volte ricodifichiamo utilizzando
<-
e poi guardiamo immediatamente i dati per verificare che sia ok?
- Possiamo mescolare
:=
in un j
che restituisce anche i dati; un aggiornamento misto e selezionare in una query. Per scoprire se j
si aggiorna solo (e quindi si comporta diversamente) potrebbe essere fonte di confusione.
Secondo aggiornamento da Matthew Dowle:
ora abbiamo trovato una soluzione e non è più v1.8.3 stampa il risultato quando si utilizza :=
. Aggiorneremo le domande frequenti 2.21 e 2.22.
Grazie! Userò '<-' in quel caso. –
+10 Non ho pensato di provare 'DT <-DT [i, col: = value]'. La ripetizione del nome della variabile non è eccezionale, ma funziona. Questo mi dà un'idea di come ottenere 'DT [i, col: = value]' per tornare invisibilmente: ora sollevato come [FR # 2128] (https://r-forge.r-project.org/tracker/index). php? func = detail & aid = 2128 & group_id = 240 & atid = 978), grazie! –
+1 per il trucco intelligente più potente + lo snippet interessante delle FAQ. –