在 R 中添加元素到列表中
Gustavo du Mortier
2023年1月30日
在 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 个元素来初始化你的向量,即使你不会使用所有的元素。