R 不循环地填充列表中的元素
我试图不使用R 不循环地填充列表中的元素,r,list,for-loop,vectorization,R,List,For Loop,Vectorization,我试图不使用for循环为列表的元素赋值 在这里,我创建一个空列表,给它一个20的长度,并命名20个元素中的每一个 mylist <- list() length(mylist) <- 20 names(mylist) <- paste0("element", 1:20, sep = "") 我尝试了以下代码,但未达到预期效果: mylist[[]] <- sample(x = x, size = 20, replace = TRUE) # Gives an error
for
循环为列表的元素赋值
在这里,我创建一个空列表,给它一个20的长度,并命名20个元素中的每一个
mylist <- list()
length(mylist) <- 20
names(mylist) <- paste0("element", 1:20, sep = "")
我尝试了以下代码,但未达到预期效果:
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
mylist[[]]也许replicate
就是你要找的
mylist <- replicate(20, sample(x = x, size = 20, replace = TRUE), simplify=FALSE)
names(mylist) <- paste0("element", 1:20, sep = "")
mylist由于您使用的是replace=TRUE
您还可以一次生成所有400个,然后将它们拆分。如果您多次这样做,这可能比replicate
更快。只有20次,速度差异根本不重要,使用replicate
的tje代码可能更容易阅读和理解,因此可能是首选
foo <- sample(x = x, size = 20*20, replace = TRUE)
mylist <- split(foo, rep(1:20, each=20))
foo-Wow!我是否应该得出结论,即使我创建了一个空列表来获取值,这也是一种循环思维方式?你说得很对。我对这三种方法进行了基准测试:replicate
、split
和matrix
,split
位居榜首,紧随其后的是matrix
。另外,您应该编辑最后一行代码,并将nrow
更改为ncol
,因为我想要的列表有20列nrow
在这种情况下起作用,因为有400个元素,但只是为了正确性。非常感谢,修好了。另外,对于未来的读者来说,很可能矩阵的大小和复制的数量不同,时间也会有所不同。你自己情况的细节可能很重要,包括可读性的需要。@SavedByJESUS也一样:也许lappy(seq(20,length(foo),20),function(x)foo[(x-19):x])
比split
快?@alexis_laz你说得对!!!使用lapply要快得多。但是,您的代码并没有给出所需的结果,即20个元素的列表,每个元素包含20个数字;你得到了什么?[我在这里发帖只是为了避免在Aaron的回答中聊天]。如果我使用您的x
和Aaron的代码并运行相同的(unname(mylist)、lappy(seq(20,length(foo),20),function(x)foo[(x-19):x])
,我会得到[1]TRUE
。我想不出有什么东西会妨碍给出正确的结果。
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)))