Добавить строку по ссылке в конце объекта data.table
В этом вопросе создатель пакета data.table
объясняет, почему строки не могут быть вставлены (или удалены) по ссылке в середине data.table
. Он также указывает, что такие операции могут быть возможны в конце таблицы. Не могли бы вы показать код, чтобы перенести это действие? Это будет «по ссылке» версия
a 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
Благодарю.
РЕДАКТИРОВАТЬ:
- Программно создавая таблицы Markdown в R с KnitR
- Вставка таблицы под легендой в гистограмме ggplot2
- Хранение объектов ggplot в списке из цикла в R
- определять интервалы последовательных целых последовательностей
- Как я могу построить с двумя разными осями y?
поскольку правильное решение пока невозможно, какое из следующего лучше (если оно отличается от другого, не уверенно) либо с точки зрения скорости, либо использования памяти?
rbind(a, data.table(id="c", var=3)) rbindlist(list(a, data.table(id="c", var=3)))
существуют ли в конце концов другие (лучшие) методы?
- R tick: объединение даты и времени в один объект
- Планирование R Script
- Как создать список фреймов данных?
- Инструменты для изготовления латексных таблиц в R
- Как извлечь цвета заливки из объекта ggplot?
- Заменить значения в фрейме данных на основе таблицы поиска
- Удалить значения NA из вектора
- Добавить новый столбец между другими столбцами dataframe
Чтобы ответить на ваше редактирование, просто запустите тест:
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
а затем просто data.table
значения (вы также можете использовать аналогичную страtagsю для std::vector
на C++
и удваивать размер каждый раз, когда вы заканчиваете пространства, если вы не знаете размер данных для начала, а затем, как только вы закончите заполнение, удалите лишние строки).