填充列表的元素而不循环

时间:2013-12-30 18:56:28

标签: r list for-loop vectorization

我尝试不使用for循环为列表元素指定值。

在这里,我创建一个空列表,给它一个20的长度并命名20个元素中的每一个。

mylist <- list()
length(mylist) <- 20
names(mylist) <- paste0("element", 1:20, sep = "")

我希望mylist的每个元素都包含从随机生成的数字池中提取的样本,表示为x

x <- runif(100, 0, 1)

我尝试了以下代码,但未达到预期效果:

mylist[[]] <- sample(x = x, size = 20, replace = TRUE) # Gives an error
mylist[[1:length(mylist)]] <- sample(x = x, size = 20, replace = TRUE) # Does not give the desired result
mylist[1:length(mylist)] <- sample(x = x, size = 20, replace = TRUE) # Gives the same undesired result as the previous line of code
mylist[] <- sample(x = x, size = 20, replace = TRUE) # Gives the same undesired result as the previous line of code

P.S。如上所述,期望的结果是20个元素的列表,其分别包含20个数值。我可以使用for循环来完成它,但我希望成为一个更好的R用户并尽可能使用矢量化操作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

也许replicate是您正在寻找的。

mylist <- replicate(20, sample(x = x, size = 20, replace = TRUE), simplify=FALSE)
names(mylist) <- paste0("element", 1:20, sep = "")

请注意,无需先创建列表,replicate会为您执行此操作。

答案 1 :(得分:3)

由于您使用replace=TRUE,您还可以同时生成所有400,然后将其拆分。如果您多次这样做,这可能会比replicate更快。只有20次,速度差异几乎不重要,使用replicate的代码可能更容易阅读和理解,因此可能是首选。

foo <- sample(x = x, size = 20*20, replace = TRUE)
mylist <- split(foo, rep(1:20, each=20))

或者,您可以先通过转换为数据框来拆分它们。不确定哪个更快。

mylist <- as.list(as.data.frame(matrix(foo, ncol=20)))