Ответ 1
Чтобы ответить на ваше редактирование, просто запустите тест:
a = data.table(id=letters[1:2], var=1:2)
b = copy(a)
c = copy(b) # let 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++
) и удвоить размер каждого раза, когда вы закончите пространство, если вы не знаете размер данных для начала, а затем, как только вы закончите заполнение, удалите лишние строки).