在 R 中新增元素到列表中
Gustavo du Mortier
2023年1月30日
2020年12月19日
在 R 中,有很多方法可以使用迴圈將任意數量的元素新增到一個列表中,當元素數量較多時,其中一些方法可能會變得遲鈍。本教程將介紹在 R 迴圈中向一個列表追加元素的最有效方法。
實現這種演算法的常見方法是建立一個 while
迴圈,並在迴圈中使用 c
(concatenate
)命令。在每一次迭代中,通過使用 c
函式增加一個元素。在這個例子中,一個值(i*3
)被新增到一個列表中,直到索引變數達到 10,000。
i <- 1
mylist <- c()
while (i<10) {
mylist <- c(mylist, i*3)
i <- i+1
}
cat(mylist)
輸出:
3 6 9 12 15 18 21 24 27
前面例子的問題是,每次執行連線時,整個列表都會被複制。當處理大型資料集時,新增所有元素所需的時間可能是巨大的。
在 R 中使用 length
函式對一個列表進行追加
在迴圈中向列表中新增任意數量的元素的更有效的方法是在每次迭代中使用 length
函式。使用 length
函式,可以得到列表中的元素數,並將每個新元素分配到最後一個元素後面的索引:length(mylist) + 1
。
下面的例子和前面的例子一樣,但效率更高。
i <- 1
mylist <- c()
while (i<10) {
mylist[[(length(mylist) + 1)]] <- i*3
i <- i+1
}
cat(mylist)
輸出:
3 6 9 12 15 18 21 24 27
設定列表的上界
如果你事先知道你的迴圈會迭代多少次,那麼你可以定義一個固定長度的向量,用來存放所有的元素,而不是增加元素列表長度。例如,如果你知道你的迴圈會迭代 10000 次,你可以這樣初始化向量。
mylist <- vector("list", 10000)
之後,你可以使用 for
迴圈,根據每個元素的索引來設定它的值。
i <- 1
for (i in 1:10000) {
mylist[[i]] <- i*3
}
如果你不知道迭代次數,但你有一個上限,你可以用這個上限定義向量。之後,當迴圈執行完畢,你可以只挑選非空元素。例如,如果你知道你的迴圈不會迭代超過 10,000 次,你可以用 10,000 個元素來初始化你的向量,即使你不會使用所有的元素。