Ajouter une liste à une liste de listes en R

j'ai des problèmes pour ajouter des données à une liste qui est déjà dans un format de liste. J'ai un programme qui va exporter des objets de résultats pendant une boucle de simulation. Les données ne sont stockées qu'une liste de matrices. Mon idée est de stocker ces listes dans une liste, puis de sauvegarder cette liste de listes en tant qu'objet R pour une analyse ultérieure, mais j'ai quelques problèmes pour y parvenir correctement. Je vais montrer ce que j'ai fait avec un petit exemple abstrait en utilisant simplement des valeurs au lieu des données matricielles de mon simulation:

disons que j'ai lancé la boucle de simulation 3 fois. Pendant les itérations, les listes de résultats doivent être collectées dans la liste des listes que je vais enregistrer comme un objet R:

liste pour contenir les autres listes et être sauvegardé: outlist1 <- list()

Première itération: resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

Deuxième Itération: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

Troisième Itération: resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

cependant, cette solution ne fonctionne pas avec la croissance d'une liste contenant des listes de cette façon, le résultat désiré est:

>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

Toutefois, au lieu de ce que je reçois est:

> 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

Comment faire pousser une liste, de sorte que la liste résultante formatée soit comme le résultat souhaité? Si je fais une analyse plus poussée de cette liste, je dois pouvoir accéder facilement aux éléments.

40
demandé sur amonk 2013-02-13 11:03:30

5 réponses

Pourrait-il être présent, ce que vous voulez avoir:

# Initial list:
myList <- list()

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

myList
59
répondu Daniel Fischer 2016-04-11 14:52:37
outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

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

mêmes résultats.

13
répondu 42- 2013-02-13 17:27:14

il y a deux autres solutions qui consistent à assigner à un index un après la fin de la liste. Voici une solution qui n'utiliser 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))

qui donne votre format demandé

> 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
9
répondu Brian Diggs 2013-02-13 16:08:57

Cette réponse est similaire à la accepté, mais un peu moins compliqué.

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
7
répondu Eduardo Bergel 2015-05-21 02:46:33

en mettant une assignation de liste sur une variable d'abord

myVar <- list()

il ouvre la possibilité d'affectations hiearchial par

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

et ainsi de suite... alors maintenant, il est possible de faire

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

ou

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

et ainsi de suite

il est également possible d'attribuer directement des noms (au lieu de $)

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

et

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

il est important de se rappeler qu'il faut toujours utiliser des crochets doubles pour faire le système

alors obtenir des informations est simple

myVar$nameofsubvar$nameofsubsubvar

et ainsi de suite...

exemple:

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

une belle caractéristique de la langue R dans sa définition hiearchiale...

Je l'ai utilisé pour une implémentation complexe (avec plus de deux niveaux) et ça marche!

4
répondu Jesse Burström 2013-10-28 23:35:39