Moje pytanie dotyczy przydzielania zadań przez referencje a kopiowania data.table
. Chcę wiedzieć, czy można usuwać wiersze przez odniesienie, podobnie do
DT[ , someCol := NULL]
Chcę wiedzieć
DT[someRow := NULL, ]
Wydaje mi się, że istnieje dobry powód, dla którego ta funkcja nie istnieje, więc może po prostu możesz wskazać dobrą alternatywę dla zwykłego podejścia do kopiowania, jak poniżej. W szczególności idąc z moim ulubionym z przykładu (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
Powiedzmy, że chcę usunąć pierwszy wiersz z tej tabeli data.table. Wiem, że potrafię to zrobić:
DT <- DT[-1, ]
ale często możemy chcieć tego uniknąć, ponieważ kopiujemy obiekt (a to wymaga około 3 * N pamięci, jeśli N object.size(DT)
, jak wskazano tutaj . Teraz znalazłem set(DT, i, j, value)
. Wiem, jak ustawić określone wartości (jak tutaj: ustaw wszystko wartości w wierszach 1 i 2 oraz kolumnach 2 i 3 do zera)
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
Ale jak mam usunąć, powiedzmy, pierwsze dwa wiersze? Robić
set(DT, 1:2, 1:3, NULL)
ustawia cały ID na NULL.
Moja znajomość SQL jest bardzo ograniczona, więc mówicie mi: podane dane. Tabela używa technologii SQL, czy istnieje odpowiednik polecenia SQL
DELETE FROM table_name
WHERE some_column=some_value
w data.table?
DT[ , keep := .I > 1]
podzbioru dla późniejszych operacji: DT[(keep), ...]
być może nawet setindex(DT, keep)
szybkości tego podzbioru. Nie jest to panaceum, ale warto rozważyć wybór projektu w swoim przepływie pracy - czy naprawdę chcesz usunąć wszystkie te wiersze z pamięci , czy wolisz je wykluczyć? Odpowiedź różni się w zależności od przypadku użycia.
data.table()
wykorzystuje technologię SQL tak bardzo, jak można narysować paralelę między różnymi operacjami w SQL i różnymi argumentami w plikudata.table
. Dla mnie odniesienie do „technologii” w pewnym stopniu sugeruje, żedata.table
siedzi gdzieś na szczycie bazy danych SQL, czego AFAIK nie ma.