将列表附加到 R 中的列表列表
Posted
技术标签:
【中文标题】将列表附加到 R 中的列表列表【英文标题】:Appending a list to a list of lists in R 【发布时间】:2013-01-28 16:21:25 【问题描述】:我在将数据附加到已采用列表格式的列表时遇到问题。我有一个程序将在模拟循环期间导出结果对象。数据本身存储为矩阵列表。我的想法是将这些列表存储在一个列表中,然后将此列表列表保存为 R 对象以供以后分析,但是我在正确实现这一点时遇到了一些问题。我将展示我在小的抽象示例中所做的,只是使用值而不是我的模拟中的矩阵数据:
假设我已经运行了 3 次模拟循环。 在迭代期间,需要将结果列表收集到我将保存为 R 对象的一个列表列表中:
List 包含其他列表并被保存:
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
如何扩展列表,以使格式化后的结果列表与预期结果一样?如果我对这些列表进行进一步分析,我需要能够轻松访问这些元素。
【问题讨论】:
你每次都覆盖outlist
。请注意,追加时您的第二个参数中没有 outlist
。
【参考方案1】:
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)
【讨论】:
【参考方案2】:请注意下面 Brian 的回答,outlist
的第一个分配也可以是 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))
如果您想在循环中从头开始构建列表,这有时会很有帮助。
【讨论】:
【参考方案3】:可能是这个,你想要的:
# Initial list:
myList <- list()
# Now the new experiments
for(i in 1:3)
myList[[length(myList)+1]] <- list(sample(1:3))
myList
【讨论】:
就是这样。包含在列表括号中的第二部分使一切不同。提供我需要的格式并防止有关对象长度倍数的警告。我之前尝试过List[[length(List)+1]] <- sample(1:3)
的等效项来尝试找到解决方案。谢谢!
您也可以使用 c(.., ..) 连接两个“列表列表”。您只需确保 c( ) 的两个参数都是列表列表。
太棒了!我发现的唯一有用的例子,虽然表明 R 是一种可怕的语言!
虽然newlist <- list(oldlist, list(someobj))
是this question 最受欢迎的答案,但在其他答案中还有其他方法。看似古怪的列表语法让人想起优雅的PROLOG lists,它使用了头部和尾部。【参考方案4】:
这个答案与公认的答案相似,但不那么复杂。
L<-list()
for (i in 1:3)
L<-c(L, list(list(sample(1:3))))
【讨论】:
【参考方案5】:首先将列表赋值给一个变量
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 语言的一个很好的特性在于它的层次定义......
我将它用于复杂的实现(具有两个以上的级别)并且它有效!
【讨论】:
【参考方案6】: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))
同样的结果。
【讨论】:
Nitpick:is.vector(list())
返回 TRUE :)【参考方案7】:
还有其他两种解决方案涉及分配给列表末尾之后的索引。这是一个使用 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
【讨论】:
以上是关于将列表附加到 R 中的列表列表的主要内容,如果未能解决你的问题,请参考以下文章