Mi pregunta está relacionada con la asignación por referencia versus la copia en data.table
. Quiero saber si uno puede eliminar filas por referencia, similar a
DT[ , someCol := NULL]
Quiero saber sobre
DT[someRow := NULL, ]
Supongo que hay una buena razón por la cual esta función no existe, por lo que tal vez podría señalar una buena alternativa al enfoque de copia habitual, como se muestra a continuación. En particular, yendo con mi favorito de ejemplo (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 quiero eliminar la primera fila de esta tabla de datos. Sé que puedo hacerlo:
DT <- DT[-1, ]
pero a menudo queremos evitar eso, porque estamos copiando el objeto (y eso requiere aproximadamente 3 * N de memoria, si es N object.size(DT)
, como se señaló aquí . Ahora descubrí set(DT, i, j, value)
. Sé cómo establecer valores específicos (como aquí: establecer todo valores en filas 1 y 2 y columnas 2 y 3 a cero)
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
Pero, ¿cómo puedo borrar las dos primeras filas, por ejemplo? Haciendo
set(DT, 1:2, 1:3, NULL)
establece todo el DT en NULL.
Mi conocimiento de SQL es muy limitado, así que ustedes me dicen: dado data.table usa tecnología SQL, ¿hay un equivalente al comando SQL?
DELETE FROM table_name
WHERE some_column=some_value
en data.table?
DT[ , keep := .I > 1]
, luego, subconjunto para operaciones posteriores: DT[(keep), ...]
quizás incluso setindex(DT, keep)
la velocidad de este subconjunto. No es una panacea, pero vale la pena considerarla como una opción de diseño en su flujo de trabajo: ¿realmente desea eliminar todas esas filas de la memoria o preferiría excluirlas? La respuesta difiere según el caso de uso.
data.table()
use la tecnología SQL tanto como se pueda establecer un paralelismo entre las diferentes operaciones en SQL y los diversos argumentos de adata.table
. Para mí, la referencia a "tecnología" de alguna manera implica quedata.table
se encuentra en la parte superior de una base de datos SQL en algún lugar, lo que AFAIK no es el caso.