将列表追加到 R 中的列表列表中

我有问题追加数据到一个列表已经在一个列表格式。我有一个程序,可以在模拟循环期间导出结果对象。数据本身存储为矩阵列表。我的想法是将这些列表存储在一个列表中,然后将这个列表作为 R 对象保存,以便以后分析,但是我在正确实现这一点方面遇到了一些问题。我将用一个小的抽象例子来展示我所做的,只是使用了值而不是模拟中的矩阵数据:

假设我已经运行了3次模拟循环。 在迭代过程中,结果列表需要被收集到一个列表中,我将这个列表保存为 R 对象:

列表以包含其他列表并进行保存: outlist1 <- list()

第一次: resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

第二次迭代: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

第三次迭代: resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

然而,这种解决方案并不适用于以这种方式增长包含列表的列表,预期的结果是:

>outlist
[[1]]
[[1]][[1]]
[1] 1


[[1]][[2]]
[1] 2


[[1]][[3]]
[1] 3


[[1]][[4]]
[1] 4


[[1]][[5]]
[1] 5




[[2]]
[[2]][[1]]
[1] 6


[[2]][[2]]
[1] 7


[[2]][[3]]
[1] 8


[[2]][[4]]
[1] 9


[[2]][[5]]
[1] 10




[[3]]
[[3]][[1]]
[1] 11


[[3]][[2]]
[1] 12


[[3]][[3]]
[1] 13


[[3]][[4]]
[1] 14


[[3]][[5]]
[1] 15

然而,我得到的却是:

> outlist3
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 1


[[1]][[1]][[2]]
[1] 2


[[1]][[1]][[3]]
[1] 3


[[1]][[1]][[4]]
[1] 4


[[1]][[1]][[5]]
[1] 5




[[1]][[2]]
[[1]][[2]][[1]]
[1] 6


[[1]][[2]][[2]]
[1] 7


[[1]][[2]][[3]]
[1] 8


[[1]][[2]][[4]]
[1] 9


[[1]][[2]][[5]]
[1] 10

如何增长列表,使得格式化的结果列表与期望的结果相似?如果我对这些列表做进一步的分析,我需要能够轻松地访问这些元素。

157683 次浏览

你想要的是这个吗:

# Initial list:
myList <- list()


# Now the new experiments
for(i in 1:3){
myList[[length(myList)+1]] <- list(sample(1:3))
}


myList
outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

append的帮助文件说它是用于矢量的。但它可以在这里使用。我以为我以前试过,但是 OP 的代码有些奇怪的异常,可能误导了我:

outlist <- list(resultsa)
outlist <- append(outlist,list(resultsb))
outlist <- append(outlist,list(resultsc))

一样的结果。

还有另外两种解决方案,它们涉及在列表末尾后面分配一个索引。下面是一个使用 append的解决方案。

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)


outlist <- list(resultsa)
outlist <- append(outlist, list(resultsb))
outlist <- append(outlist, list(resultsc))

给出了你要求的格式

> str(outlist)
List of 3
$ :List of 5
..$ : num 1
..$ : num 2
..$ : num 3
..$ : num 4
..$ : num 5
$ :List of 5
..$ : num 6
..$ : num 7
..$ : num 8
..$ : num 9
..$ : num 10
$ :List of 5
..$ : num 11
..$ : num 12
..$ : num 13
..$ : num 14
..$ : num 15

首先在变量上赋值 list

myVar <- list()

它开启了阶级分配的可能性

myVar[[1]] <- list()
myVar[[2]] <- list()

诸如此类。 所以现在可以做

myVar[[1]][[1]] <- c(...)
myVar[[1]][[2]] <- c(...)

或者

myVar[[1]][['subVar']] <- c(...)

诸如此类

也可以直接指定名称(而不是 $)

myVar[['nameofsubvar]] <- list()

然后

myVar[['nameofsubvar]][['nameofsubsubvar']] <- c('...')

重要的是要记住总是使用双括号来使系统工作

那么获取信息就很简单了

myVar$nameofsubvar$nameofsubsubvar

诸如此类。

例如:

a <-list()
a[['test']] <-list()
a[['test']][['subtest']] <- c(1,2,3)
a
$test
$test$subtest
[1] 1 2 3




a[['test']][['sub2test']] <- c(3,4,5)
a
$test
$test$subtest
[1] 1 2 3


$test$sub2test
[1] 3 4 5

R 语言的一个很好的特点,在它的层次定义..。

我用它来实现一个复杂的实现(有两个以上的级别) ,它工作!

这个答案与公认的答案相似,但不那么复杂。

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}

下面是布莱恩的答案,第一个作业也可以是一个 append语句,所以你也可以这样做:

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)


outlist <- list()
outlist <- append(outlist,list(resultsa))
outlist <- append(outlist, list(resultsb))
outlist <- append(outlist, list(resultsc))

如果您想在循环中从头开始构建列表,这有时会很有帮助。

purrr包有许多方便的函数用于处理列表。flatten命令可以清除不需要的嵌套。

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)


nested_outlist <- list(resultsa, resultsb, resultsc)
outlist <- purrr::flatten(nested_outlist)