Pertanyaan saya terkait dengan penugasan dengan referensi versus menyalin data.table
. Saya ingin tahu apakah seseorang dapat menghapus baris dengan referensi, mirip dengan
DT[ , someCol := NULL]
Saya ingin tahu tentang
DT[someRow := NULL, ]
Saya kira ada alasan bagus mengapa fungsi ini tidak ada, jadi mungkin Anda bisa menunjukkan alternatif yang baik untuk pendekatan penyalinan biasa, seperti di bawah ini. Secara khusus, pergi dengan favorit saya dari contoh (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
Katakanlah saya ingin menghapus baris pertama dari data ini. Saya tahu saya bisa melakukan ini:
DT <- DT[-1, ]
tetapi seringkali kita mungkin ingin menghindarinya, karena kita menyalin objek (dan itu membutuhkan sekitar 3 * N memori, jika N object.size(DT)
, seperti yang ditunjukkan di sini . Sekarang saya temukan set(DT, i, j, value)
. Saya tahu cara mengatur nilai tertentu (seperti di sini: atur semua nilai dalam baris 1 dan 2 dan kolom 2 dan 3 ke nol)
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
Tapi bagaimana saya bisa menghapus dua baris pertama, katakan? Perbuatan
set(DT, 1:2, 1:3, NULL)
mengatur seluruh DT ke NULL.
Pengetahuan SQL saya sangat terbatas, jadi kalian beri tahu saya: diberikan data. Tabel menggunakan teknologi SQL, apakah ada yang setara dengan perintah SQL
DELETE FROM table_name
WHERE some_column=some_value
dalam data.table?
DT[ , keep := .I > 1]
, kemudian subset untuk operasi selanjutnya :, DT[(keep), ...]
bahkan mungkin setindex(DT, keep)
kecepatan subset ini. Bukan obat mujarab, tetapi layak untuk dipertimbangkan sebagai pilihan desain dalam alur kerja Anda - apakah Anda benar-benar ingin menghapus semua baris itu dari memori , atau apakah Anda lebih suka mengecualikannya? Jawabannya berbeda dengan use case.
data.table()
menggunakan teknologi SQL sebanyak yang dapat menarik paralel antara operasi yang berbeda dalam SQL dan berbagai argumen kedata.table
. Bagi saya, referensi ke "teknologi" agak menyiratkan yangdata.table
duduk di atas database SQL di suatu tempat, yang AFAIK tidak demikian.