还有另一种分配给列表的方法,使用my_list[[name or number]] <-
. 如果您真的想循环执行此操作,只需遍历名称为 iter1、iter2、...
A <- list()
n_iter <- 2
for (i in 1:n_iter){
iname <- paste("iter",i,sep="")
A[[iname]] <- get(iname)
}
正如@mnel 指出的那样,动态增长列表效率低下。我认为,另一种方法是使用lapply
:
n_iter <- 2
inames <- paste("iter",1:n_iter,sep="")
names(inames) <- inames
A <- lapply(inames,get)
这也可以使用数据框来完成,如果您的子列表总是有两个元素,每个元素都有一个一致的类(item1 是数字,item 2 是字符),这将是一种更好的格式。
n_iter <- 2
DF <- data.frame(item1=rep(0,n_iter),item2=rep("",n_iter),stringsAsFactors=FALSE)
for (i in 1:n_iter){
iname <- paste("iter",i,sep="")
DF[i,] <- get(iname)
rownames(DF)[i] <- iname
}
# item1 item2
# iter1 1 a
# iter2 1 b
但是,这是一种非常丑陋的做事方式。使用时,事情很快就会变得一团糟get
。使用您的数据结构,也许您想在循环中创建 iter1 和 iter2 并立即将它们嵌入到父列表或数据框中?
n_iter = 10
DF <- data.frame(item1 = rep(0,n_iter), item2 = rep("",n_iter))
for (i in 1:n_iter){
... do stuff to make anum and achar ...
DF[i,"item1"] <- anum
DF[i,"item2"] <- achar
}
其中 anum 和 achar 是您要从该迭代中存储的 item1 和 item2 的值。在 SO 的其他地方,他们说使用该data.table
包的替代方案几乎是这种数据帧分配的 10 倍快/高效。
哦,最后一个想法:如果您想先将它们放入列表中,您可以稍后轻松转换为数据框
DF <- do.call(rbind.data.frame,A)