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.
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
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.
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
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))))
}
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!