Minha pergunta está relacionada à atribuição por referência versus cópia data.table
. Quero saber se é possível excluir linhas por referência, semelhante a
DT[ , someCol := NULL]
Eu quero saber sobre
DT[someRow := NULL, ]
Eu acho que há uma boa razão para que essa função não exista, então talvez você possa apenas apontar uma boa alternativa para a abordagem de cópia usual, como abaixo. Em particular, indo com o meu favorito do exemplo (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
Digamos que eu queira excluir a primeira linha desta data.table. Eu sei que posso fazer isso:
DT <- DT[-1, ]
mas frequentemente podemos evitar isso, porque estamos copiando o objeto (e isso requer cerca de 3 * N de memória, se N object.size(DT)
, conforme indicado aqui . Agora eu encontrei set(DT, i, j, value)
. Eu sei como definir valores específicos (como aqui: definir tudo valores nas linhas 1 e 2 e nas colunas 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
Mas como posso apagar as duas primeiras linhas, digamos? Fazendo
set(DT, 1:2, 1:3, NULL)
define o DT inteiro como NULL.
Meu conhecimento de SQL é muito limitado, então vocês me dizem: dado o data.table usa a tecnologia SQL, existe um equivalente ao comando SQL
DELETE FROM table_name
WHERE some_column=some_value
em data.table?
DT[ , keep := .I > 1]
, então, subconjunto para operações posteriores:, DT[(keep), ...]
talvez até setindex(DT, keep)
a velocidade desse subconjunto. Não é uma panacéia, mas vale a pena considerar como uma opção de design em seu fluxo de trabalho - você realmente deseja excluir todas essas linhas da memória ou prefere excluí-las? A resposta difere por caso de uso.
data.table()
use a tecnologia SQL tanto quanto se possa traçar um paralelo entre as diferentes operações no SQL e os vários argumentos de adata.table
. Para mim, a referência a "tecnologia" implica, de certa forma, que eladata.table
esteja no topo de um banco de dados SQL em algum lugar, o que não é o caso do AFAIK.