La mia domanda è relativa all'assegnazione per riferimento rispetto alla copia in data.table
. Voglio sapere se uno può eliminare le righe per riferimento, simile a
DT[ , someCol := NULL]
Voglio sapere
DT[someRow := NULL, ]
Immagino che ci sia una buona ragione per cui questa funzione non esiste, quindi forse potresti semplicemente indicare una buona alternativa al solito approccio alla copia, come di seguito. In particolare, andando con il mio preferito dall'esempio (data.table),
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Di 'che voglio eliminare la prima riga da questo data.table. So che posso fare questo:
DT <- DT[-1, ]
ma spesso potremmo volerlo evitare, perché stiamo copiando l'oggetto (e ciò richiede circa 3 * N di memoria, se N object.size(DT)
, come indicato qui . Ora ho trovato set(DT, i, j, value)
. So come impostare valori specifici (come qui: imposta tutto valori nelle righe 1 e 2 e colonne 2 e 3 a zero)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Ma come posso cancellare le prime due righe, diciamo? fare
set(DT, 1:2, 1:3, NULL)
imposta l'intero DT su NULL.
La mia conoscenza di SQL è molto limitata, quindi voi ragazzi mi dite: dato data.table utilizza la tecnologia SQL, esiste un equivalente al comando SQL
DELETE FROM table_name
WHERE some_column=some_value
in data.table?
DT[ , keep := .I > 1]
, quindi, il sottoinsieme per le operazioni successive:, DT[(keep), ...]
forse anche setindex(DT, keep)
la velocità di questo sottoinsieme. Non è una panacea, ma vale la pena considerarla come una scelta progettuale nel tuo flusso di lavoro: vuoi davvero eliminare tutte quelle righe dalla memoria o preferiresti escluderle? La risposta varia in base al caso d'uso.
data.table()
usi la tecnologia SQL tanto quanto si può tracciare un parallelo tra le diverse operazioni in SQL e i vari argomenti adata.table
. Per me, il riferimento alla "tecnologia" implica in qualche modo chedata.table
si trovi sopra un database SQL da qualche parte, il che non è il caso di AFAIK.