Вопрос: Добавить строку по ссылке в конце объекта data.table


В этом вопрос   data.table Создатель пакета объясняет, почему строки не могут быть вставлены (или удалены) по ссылке в середине a data.table все же. Он также указывает, что такие операции могут быть возможны в конце таблицы. Не могли бы вы показать код, чтобы перенести это действие? Это будет «по ссылке» версия

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

Благодарю.

РЕДАКТИРОВАТЬ:

поскольку правильное решение пока невозможно, какое из следующего лучше (если оно отличается от другого, не уверенно) либо с точки зрения скорости, либо использования памяти?

rbind(a, data.table(id="c", var=3))

rbindlist(list(a,  data.table(id="c", var=3)))

существуют ли в конце концов другие (лучшие) методы?


32


источник


Ответы:


Чтобы ответить на ваше редактирование, просто запустите тест:

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 явно лучше, чем rbind, Благодаря Мэтью Доуле, указывая на проблемы с использованием [ в цикле я добавил еще один тест с set,

Из вышесказанного ваши лучшие варианты используют rbindlist, или data.table для начала, а затем просто для заполнения значений (вы также можете использовать аналогичную стратегию для std::vector в C++, и удваивайте размер каждый раз, когда у вас заканчивается пространство, если вы не знаете размер данных для начала, а затем, как только вы закончите заполнение, удалите лишние строки).


18