Dodaj wiersz przez odniesienie na końcu danych.obiekt tabeli
W tym pytaniu twórca pakietu data.table
wyjaśnia, dlaczego wiersze nie mogą być wstawiane (lub usuwane) przez odniesienie w środku a data.table
. Zwraca również uwagę, że takie operacje mogą być możliwe na końcu tabeli. Możesz pokazać kod do perfekcji tej akcji? Będzie to wersja" przez odniesienie "
a<- data.table(id=letters[1:2], var=1:2)
> a
id var
1: a 1
2: b 2
> rbind(a, data.table(id="c", var=3))
id var
1: a 1
2: b 2
3: c 3
Dzięki.
EDIT:
Ponieważ właściwe rozwiązanie nie jest jeszcze możliwe, które z poniższych rozwiązań jest lepsze (jeśli wewnętrznie Inne, Nie wiem) albo z szybkości i wykorzystania pamięci perpective?
rbind(a, data.table(id="c", var=3))
rbindlist(list(a, data.table(id="c", var=3)))
Czy są w końcu inne (lepsze) metody?
1 answers
Aby odpowiedzieć na Twoją edycję, po prostu uruchom benchmark:
a = data.table(id=letters[1:2], var=1:2)
b = copy(a)
c = copy(b) # let's also just try modifying same value in place
# to see how well changing existing values does
microbenchmark(a <- rbind(a, data.table(id="c", var=3)),
b <- rbindlist(list(b, data.table(id="c", var=3))),
c[1, var := 3L],
set(c, 1L, 2L, 3L))
#Unit: microseconds
# expr min lq median uq max neval
# a <- rbind(a, data.table(id = "c", var = 3)) 865.460 1141.2585 1357.1230 1539.4300 6814.492 100
#b <- rbindlist(list(b, data.table(id = "c", var = 3))) 260.440 325.3835 445.4190 522.8825 1143.930 100
# c[1, `:=`(var, 3L)] 482.147 626.5570 778.3135 904.3595 1109.539 100
# set(c, 1L, 2L, 3L) 2.339 5.677 7.5140 9.5170 19.033 100
rbindlist
jest wyraźnie lepszy niż rbind
. Dzięki temu, że Matthew Dowle zwrócił uwagę na problemy z używaniem [
W pętli, dodałem kolejny benchmark z set
.
Z powyższego najlepiej jest użyć rbindlist
, lub rozmiar data.table
na początek, a następnie po prostu wypełnić wartości (możesz również użyć podobnej strategii do std::vector
w C++
, i podwoić Rozmiar za każdym razem, gdy zabraknie miejsca, jeśli nie wiesz, jaki rozmiar jest Rozmiar pliku. dane na początek, a następnie po zakończeniu wypełniania, usuń dodatkowe wiersze).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 15:05:03