我尝试不使用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用户并尽可能使用矢量化操作。
感谢您的帮助。
答案 0 :(得分:5)
也许replicate
是您正在寻找的。 p>
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)))