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?

Author: Community, 2013-05-28

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).

 19
Author: eddi,
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