在R中构建嵌套列表

Sam*_*Sam 4 loops nested r list

我写了一个函数,它的输出是一个列表.我想把我的函数放到一个循环中,我想将每个迭代的输出(当然是列表)存储到一个更大的列表中.换句话说,这个BIG列表的每个元素也是一个列表.c()没有做我想要的.有没有办法做到这一点?

为了更好地理解我的要求,请考虑以下示例:

iter1 <- list(item1 = 1, item2 = "a")
iter2 <- list(item1 = 1, item2 = "b")
All <- list(iter1 = iter1, iter2 = iter2)
Run Code Online (Sandbox Code Playgroud)

我希望能够在循环中执行类似于上面代码的操作.我怎样才能做到这一点?

谢谢你的帮助,

Fra*_*ank 7

还有另一种分配给列表的方法,使用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)
}
Run Code Online (Sandbox Code Playgroud)

正如@mnel指出的那样,动态增长列表是低效的.我认为,替代方案是使用lapply:

n_iter <- 2
inames <- paste("iter",1:n_iter,sep="")
names(inames) <- inames
A <- lapply(inames,get)
Run Code Online (Sandbox Code Playgroud)

这也可以使用数据框来完成,如果您的子列表总是有两个元素,每个元素都有一个一致的类(item1是数字,第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
Run Code Online (Sandbox Code Playgroud)

然而,这是一种非常丑陋的做事方式; 使用时,事情会很快变得混乱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
}
Run Code Online (Sandbox Code Playgroud)

其中anum和achar是要从该迭代存储的item1和item2的值.在SO的其他地方,他们说有一种替代品使用的data.table包装几乎是这种数据帧分配的10倍速度/效率.

哦,最后一个想法:如果你想先将它们放在一个列表中,你可以稍后轻松转换为数据框

DF <- do.call(rbind.data.frame,A)
Run Code Online (Sandbox Code Playgroud)


Ric*_*rta 5

这会让你相当于你的 All

c(iter1=list(iter1), iter2=list(iter2))

> identical(c(iter1=list(iter1), iter2=list(iter2)), All)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

假设您要添加第三个列表All:

c(All, list(iter3=iter3))
Run Code Online (Sandbox Code Playgroud)

如果你不关心列表名称,它看起来更清洁一点

 c(list(iter1), list(iter2))
Run Code Online (Sandbox Code Playgroud)