有效地向R中的向量或列表添加或删除元素?

Rya*_*son 14 performance r vector

我正在实现一个算法,该算法涉及从集合中添加和删除大量内容.在R中,这很慢,因为据我所知,从向量中添加或删除内容很慢,因为必须重新分配整个向量.有没有办法更有效地做到这一点?

编辑:我当前的解决方案是使用一个布尔向量,其长度与可以在集合中的事物列表相同,并将其用作成员资格表.

Jam*_*mes 14

R Inferno的第2章对此有一些有趣的评论,包括用于减少内存碎片和分配开销的perdiodic增长对象.

如果您知道集合的最终大小是什么,那么您建议的方法可能是最好的 - 即subset使用适当的成员资格向量来自整个宇宙.很难知道什么是最好的,但没有看到你正在尝试做什么.


wkm*_*or1 13

如果可以,在算法期间初始化向量使其长度等于其最大长度可能会有所帮助.

例如

vec <- rep(NA,10)
vec[1:3] <- 1:3
vec[4:5] <- 4:5
vec[6:10] <- 6:10
Run Code Online (Sandbox Code Playgroud)

而不是

vec <- 1:3
vec <- c(vec,4:5)
vec <- c(vec,6:10)
Run Code Online (Sandbox Code Playgroud)

相比

> 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 
Run Code Online (Sandbox Code Playgroud)

> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) })
   user  system elapsed 
  0.249   0.089   0.335
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 5

很难说你想要什么。也许您真的想要堆栈命令,例如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. 
Run Code Online (Sandbox Code Playgroud)

  • @John:`myVec &lt;- rep(NA, maxLength)` 更干净地替换了前两行。另外,大写是怎么回事? (2认同)