我在将数据附加到已经采用列表格式的列表时遇到问题。我有一个程序,它将在模拟循环中导出结果对象。数据本身存储为矩阵列表。我的想法是将这些列表存储在列表中,然后将该列表列表另存为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
我如何增加列表,使格式化后的列表看起来像期望的结果?如果要对这些列表进行进一步分析,我需要能够轻松访问这些元素。
是您想要的吗?
# 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
此答案与公认的答案相似,但不那么复杂。
L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
通过将列表分配首先放在变量上
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语言在hiearchial定义中的一个不错的功能...
我将其用于复杂的实现(具有两个以上级别),并且可以正常工作!
仅需注意下面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))
如果您想从头开始构建列表,这有时会很有帮助。