Мой вопрос связан с назначением по ссылке, а не копированием в data.table
. Я хочу знать, если можно удалить строки по ссылке, аналогично
DT[ , someCol := NULL]
Я хочу знать о
DT[someRow := NULL, ]
Я думаю, есть веская причина, почему эта функция не существует, поэтому, возможно, вы могли бы просто указать на хорошую альтернативу обычному подходу к копированию, как показано ниже. В частности, перейдя с моей любимой из примера (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
Скажем, я хочу удалить первую строку из этого data.table. Я знаю, что могу это сделать:
DT <- DT[-1, ]
но часто мы можем захотеть избежать этого, потому что мы копируем объект (а это требует около 3 * N памяти, если N object.size(DT)
, как указано здесь . Теперь я обнаружил set(DT, i, j, value)
. Я знаю, как установить конкретные значения (как здесь: установить все значения в строках 1 и 2 и столбцах 2 и 3 равны нулю)
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
Но как я могу стереть первые два ряда, скажем? дела
set(DT, 1:2, 1:3, NULL)
устанавливает весь DT в NULL.
Мои знания SQL очень ограничены, так что вы, ребята, скажите мне: данный data.table использует технологию SQL, есть ли эквивалент команды SQL
DELETE FROM table_name
WHERE some_column=some_value
в data.table?
DT[ , keep := .I > 1]
, затем подмножество для последующих операций: DT[(keep), ...]
возможно, даже setindex(DT, keep)
скорость этого подмножества. Не панацея, но стоит рассмотреть в качестве варианта дизайна в вашем рабочем процессе - вы действительно хотите удалить все эти строки из памяти , или вы бы предпочли исключить их? Ответ зависит от варианта использования.
data.table()
использует технологию SQL настолько, насколько можно провести параллель между различными операциями в SQL и различными аргументами adata.table
. Для меня ссылка на «технологию» в некоторой степени подразумевает, что онаdata.table
находится где-то на вершине базы данных SQL, что не соответствует AFAIK.