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

War*_*250 56 r list append matrix extend

我有问题将数据附加到已经是列表格式的列表中.我有一个程序,它将在模拟循环中导出结果对象.数据本身存储为矩阵列表.我的想法是将这些列表存储在一个列表中,然后将这个列表列表保存为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
Run Code Online (Sandbox Code Playgroud)

但是,我得到的是:

> 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
Run Code Online (Sandbox Code Playgroud)

如何生成列表,以便格式化的结果列表与所需的结果类似?如果我对这些列表进行进一步分析,我需要能够轻松访问这些元素.

Dan*_*her 72

可能是这个,你想拥有什么:

# Initial list:
myList <- list()

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

myList
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用c(..,..)来连接两个"列表列表".您只需要确保c()的两个参数都是列表. (11认同)
  • 出色的!我发现的唯一有用的例子,尽管表明 R 是一种可怕的语言! (2认同)

42-*_*42- 18

outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)
Run Code Online (Sandbox Code Playgroud)

append的帮助文件说它适用于矢量.但它可以在这里使用.我以为我之前尝试过,但OP的代码中有一些奇怪的异常,可能会误导我:

outlist <- list(resultsa)
outlist <- append(outlist,list(resultsb))
outlist <- append(outlist,list(resultsc))
Run Code Online (Sandbox Code Playgroud)

结果相同.

  • Nitpick:`is.vector(list())`返回TRUE :) (3认同)

Bri*_*ggs 11

还有另外两种解决方案涉及在列表末尾分配一个索引.这是一个确实使用的解决方案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))
Run Code Online (Sandbox Code Playgroud)

它提供了您要求的格式

> 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
Run Code Online (Sandbox Code Playgroud)


Edu*_*gel 8

这个答案类似于已接受的答案,但有点不那么令人费解.

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
Run Code Online (Sandbox Code Playgroud)


小智 5

通过首先将列表分配放在变量上

myVar <- list()
Run Code Online (Sandbox Code Playgroud)

它打开了由

myVar[[1]] <- list()
myVar[[2]] <- list()
Run Code Online (Sandbox Code Playgroud)

等等...所以现在可以做

myVar[[1]][[1]] <- c(...)
myVar[[1]][[2]] <- c(...)
Run Code Online (Sandbox Code Playgroud)

要么

myVar[[1]][['subVar']] <- c(...)
Run Code Online (Sandbox Code Playgroud)

等等

也可以直接分配名称(而不是$)

myVar[['nameofsubvar]] <- list()
Run Code Online (Sandbox Code Playgroud)

然后

myVar[['nameofsubvar]][['nameofsubsubvar']] <- c('...')
Run Code Online (Sandbox Code Playgroud)

要记住的重要一点是,始终使用双括号使系统正常工作

然后获取信息很简单

myVar$nameofsubvar$nameofsubsubvar
Run Code Online (Sandbox Code Playgroud)

等等...

例:

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
Run Code Online (Sandbox Code Playgroud)

R语言的hiearchial定义的一个不错的功能...

我将其用于复杂的实现(具有两个以上的级别),并且可以正常工作!