在R中预分配列表

57

在R中,在循环中扩展数据结构效率低下。我如何预分配指定大小的listmatrix可以通过ncolnrow参数轻松实现此功能。那么在列表中该怎么做呢?例如:

x <- list()
for (i in 1:10) {
    x[[i]] <- i
}

我认为这种方法不够高效。有什么更好的做法吗?

4个回答

94

vector 可以创建所需模式和长度的空向量。

x <- vector(mode = "list", length = 10)

10
我发现自己大约每2-3个月会回到这个答案。 - stevec

25

继续 @Jilber 的回答,lapply 是专门为这种类型的操作而设计的。

你可以使用 lapply 来替代 for 循环:

x <- lapply(1:10, function(i) i)

你可以将此扩展到更复杂的例子。通常,for循环体中的内容可以直接转换为一个函数,该函数接受类似于循环的每次迭代中所看到的行的单个行。


2
你也可以使用 x <- lapply(1:10, c) 来避免匿名函数。在我的机器上,这种方法快 2.5 微秒。 - Brian Albert Monroe

6

类似这样:

   x <- vector('list', 10)

但是使用lapply是最佳选择。

1

所有三个现有的答案都很好。

vector() 函数可以创建一个 列表 的原因在 JennyBC's purrr tutorial 中有解释:

在 R 中,列表实际上仍然是一个向量,但它不是原子向量。 我们使用 list() 显式地构造一个列表,但是像原子向量一样,大多数列表在实际生活中以其他方式创建。

要预分配一个列表

list <- vector(mode = "list", length = 10)

如何预分配一个向量

vec <- rep(NA, 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接