Как я могу допустить, что rbind () не станет очень медленным, поскольку размер фреймворка увеличивается?

У меня есть dataframe только с 1 строкой. Для этого я начинаю добавлять строки с помощью rbind

df #mydataframe with only one row for (i in 1:20000) { df<- rbind(df, newrow) } 

это становится очень медленным, когда я рос. Почему это? и как я могу сделать этот тип кода быстрее?

Вы находитесь во втором круге ада , а именно, не в состоянии заранее выделить структуры данных.

Растущие объекты таким образом – Очень Очень Плохая Вещь в R. Либо предварительно распределить и вставить:

 df <- data.frame(x = rep(NA,20000),y = rep(NA,20000)) 

или реструктурировать свой код, чтобы избежать такого рода инкрементного добавления строк. Как упоминалось в ссылке, которую я цитирую, причиной медленности является то, что каждый раз, когда вы добавляете строку, R необходимо найти новый непрерывный блок памяти, чтобы он соответствовал кадру данных. Скопируйте копию.

Я попробовал пример. Для чего он стоит, он согласен с утверждением пользователя о том, что вставка строк в фрейм данных также очень медленная. Я не совсем понимаю, что происходит, так как я ожидал, что проблема распределения будет превзойти скорость копирования. Может ли кто-нибудь повторить это или объяснить, почему приведенные ниже результаты (rbind

edit : в первый раз я забыл инициализировать объект в hell2fun для фрейма данных, поэтому код выполнял операции с matrixми, а не операции с фреймами данных, которые намного быстрее. Если я получу шанс, я продолжу сравнение с фреймом данных и матрицей. Однако качественные утверждения в первом абзаце.

 N <- 1000 set.seed(101) r <- matrix(runif(2*N),ncol=2) ## second circle of hell hell2fun <- function() { df <- as.data.frame(rbind(r[1,])) ## initialize for (i in 2:N) { df <- rbind(df,r[i,]) } } insertfun <- function() { df <- data.frame(x=rep(NA,N),y=rep(NA,N)) for (i in 1:N) { df[i,] <- r[i,] } } rsplit <- as.list(as.data.frame(t(r))) rbindfun <- function() { do.call(rbind,rsplit) } library(rbenchmark) benchmark(hell2fun(),insertfun(),rbindfun()) ## test replications elapsed relative user.self ## 1 hell2fun() 100 32.439 484.164 31.778 ## 2 insertfun() 100 45.486 678.896 42.978 ## 3 rbindfun() 100 0.067 1.000 0.076 

Давайте будем гением компьютера.