Моє запитання пов'язане із призначенням посиланням на копіювання в 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
Скажіть, я хочу видалити перший рядок із цього таблиця даних. Я знаю, що можу це зробити:
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 не є випадком.