Эффективно добавляя или удаляя элементы к вектору или списку в R?

Я реализую алгоритм, который включает большое добавление и удаление вещей от наборов. В R это медленно, потому что насколько я знаю, добавляя или удаляя вещи из вектора, является медленным, так как весь вектор должен быть перераспределен. Существует ли путь, действительно делают это более эффективно?

Править: Мое текущее решение состоит в том, чтобы использовать булев вектор той же длины как список вещей, которые могут быть в наборе и использовании что как таблица членства.

14
задан Ryan C. Thompson 6 May 2010 в 05:18
поделиться

3 ответа

В главе 2 The R Inferno есть несколько интересных комментариев по этому поводу, включая пердиодический рост объектов для уменьшения фрагментации памяти и накладных расходов на выделение.

Если вы знаете, каков конечный размер множества, то предложенный вами метод, вероятно, будет лучшим - т.е. подмножество из всей вселенной с использованием подходящего вектора принадлежности. Трудно сказать, что лучше, не видя, что именно вы пытаетесь сделать.

14
ответ дан 1 December 2019 в 07:51
поделиться

Если вы можете, инициализируйте вектор так, чтобы его длина была равна его максимальной длине во время работы алгоритма, это может помочь.

например,

vec <- rep(NA,10)
vec[1:3] <- 1:3
vec[4:5] <- 4:5
vec[6:10] <- 6:10

вместо

vec <- 1:3
vec <- c(vec,4:5)
vec <- c(vec,6:10)

сравнить

> system.time({vec <- rep(NA,10^4); for (i in 1:(10^4)) vec[i] <- i })
   user  system elapsed 
  0.043   0.001   0.044 

с

> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) })
   user  system elapsed 
  0.249   0.089   0.335
13
ответ дан 1 December 2019 в 07:51
поделиться

Трудно сказать, что вы хотите. Возможно, вам действительно нужны команды стека, такие как push и pop. Это не так. Но это быстрое решение.

Выделите вектор, достаточно большой, чтобы вместить все элементы нужного вам типа. Установите каждое значение на NA. Добавить предметы просто. Удаление элементов снова устанавливает для них значение NA. Использование вектора - это просто na.omit (myVec)

myVec <- numeric (maxLength)  # a vector of maximum length

is.na(myVec) <- 1:maxLength   # set every item in myVec to NA

myVec[c(2,6,20)] <- 5         # add some values

na.omit(myVec)

#This will also work if you can initialize all of your values to something that you know you won't need. 
5
ответ дан 1 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: