簡體   English   中英

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

[英]Efficiently adding or removing elements to a vector or list in R?

我正在實現一個算法,該算法涉及從集合中添加和刪除大量內容。 在R中,這很慢,因為據我所知,從向量中添加或刪除內容很慢,因為必須重新分配整個向量。 有沒有辦法更有效地做到這一點?

編輯:我當前的解決方案是使用一個布爾向量,其長度與可以在集合中的事物列表相同,並將其用作成員資格表。

R Inferno的第2章對此有一些有趣的評論,包括用於減少內存碎片和分配開銷的perdiodic增長對象。

如果您知道集合的最終大小是什么,那么您建議的方法可能是最好的 - 即使用適當的成員資格向量來自整個宇宙的subset 很難知道什么是最好的,但沒有看到你正在嘗試做什么。

如果可以,在算法期間初始化向量使其長度等於其最大長度可能會有所幫助。

例如

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

很難說你想要什么。 也許你真的想要像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. 

是的,有更有效的方法。

這取決於你如何使用數據; 你的用例。 您是按照相同的順序,按相反順序,按隨機順序或按排序順序取出數據?

對於FIFO ,對於固定大小的陣列,使用循環緩沖區 ,或者對於完全動態的大小,使用deque (發音為deck)。 (這可能是你想要的。)

對於FILO ,請使用堆棧

要隨機抓取數據,請考慮使用從未調整大小的1列矩陣。 調整大小很慢。

如果您需要有序集(例如c(3,2,5) -> c(2,3,5) ),請查看樹或堆

  • 樹可以用於比較,例如,抓取集合中<5.5的所有元素。
  • 堆只適合抓取最大或最小的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM