2016-07-16 2 views
0

j'ai des données qui ressemble à ceci:Pour boucle à échantillon à partir d'une autre liste fondée sur la condition

List_of_lists = list("0" = list(4,6), "1" = list(6,8), "2" = list(7,9), 
        "3" = list(4,8), "4" = list(3,9,0), "6" = list(1,7,0), 
        "7" = list(2,6), "8" = list(1,3), "9" = list(2,4)) 

Je voudrais écrire une fonction itérative que les premiers échantillons du premier indice de List_of_Moves (ie " 0 "), et pour les itérations suivantes, échantillonnez à partir d'une liste différente dont le nom correspond au résultat de l'itération précédente. En d'autres termes, si le résultat de la première itération est un 4, alors j'échantillonne de la liste dont le nom est "4" - et ainsi de suite.

Dans "Hack-n-slash" sous forme de R, il ressemble à ceci:

> sample(unlist(List_of_lists"0",1,replace=TRUE) 
4 
> sample(unlist(List_of_lists"4",1,replace=TRUE) 
3 
> sample(unlist(List_of_lists"3",1,replace=TRUE) 
8 
> sample(unlist(List_of_lists"8",1,replace=TRUE) 
1 
> sample(unlist(List_of_lists"1",1,replace=TRUE) 
6 

Répondre

3

Peut-être quelque chose comme ça. Nous prélevons un élément de la List_of_lists, stocker le résultat et le transmettre comme paramètre initial à la ronde suivante et en même temps réduire la taille par 1 jusqu'à ce que nous rencontrons le size criterial où nous revenons NULL et l'itération arrête:

r_ge <- function(init = "0", size) { 
    if(size == 0) NULL 
    else { 
     tmp <- sample(List_of_lists[[as.character(init)]], 1) 
     c(unlist(tmp), r_ge(tmp, size - 1)) 
    } 
} 

cas d'utilisation:

r_ge(size = 5) 
# [1] 4 9 2 9 2 
r_ge(size = 5) 
# [1] 6 1 8 1 6 
r_ge(size = 5) 
# [1] 6 0 4 9 4 
r_ge(size = 5) 
# [1] 4 9 4 0 4 
+0

Vous ne savez pas si c'est ce que vous voulez dire. Le nombre d'itérations est le paramètre de taille que vous avez passé et la somme totale peut être calculée après l'itération comme 'sum (r_ge (size = 5))'. – Psidom

+0

Si vous voulez le répliquer 1000 fois, vous pouvez calculer la moyenne à partir de la sortie comme 'mean (replicate (1000, r_ge (size = 5)))'. – Psidom

+0

Ce que fait cette fonction est de retourner un échantillon de taille spécifique comme toutes les autres fonctions, le résultat peut être manipulé comme d'autres fonctions comme 'sample' ou' rnorm' par exemple. – Psidom

3

Sinon, je crois que cela fait aussi ce que vous ce que:

first_seed <- rbinom(n = 1, size = 9, prob = .5) # just to get a starting value 
for (i in 1:20){ 
    first_seed <- sample(x = unlist(List_of_lists[[as.character(first_seed)]][]), 1) 
    print(first_seed) 
} 

Quelques notes: rbinom() n'est pas parfait pour obtenir la première valeur, mais je vous laisse le modifier. En outre, le 1:20 est juste à des fins de démonstration, évidemment augmenter ou diminuer le nombre d'itérations comme souhaité.