For循环从基于条件的不同列表中进行采样

时间:2016-07-16 19:57:51

标签: r if-statement for-loop sample

我的数据如下:

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))

我想编写一个迭代函数,该函数首先从List_of_Moves的第一个索引(即" 0")进行采样,然后对于后续迭代,从另一个列表中采样name与上一次迭代的结果匹配。换句话说,如果第一次迭代的结果是4,那么我从列表中采样,其名称为" 4" - 依此类推。

In" Hack-n-Slash" R形式,它看起来像这样:

> 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

2 个答案:

答案 0 :(得分:3)

可能是这样的。我们对List_of_lists中的元素进行抽样,将其存储为结果,并将其作为初始参数传递给下一轮,同时将大小减小1直到我们遇到size标准我们返回NULL并迭代停止的地方:

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

用例:

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

答案 1 :(得分:3)

或者,我相信这也符合你的要求:

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

一些注意事项:rbinom()并不适合获取第一个值,但我会留给您修改。此外,1:20仅用于演示目的,显然可以根据需要增加或减少迭代次数。