使用purrr创建while循环以模拟数据

时间:2019-03-12 20:47:24

标签: r purrr

我正在运行模拟,过去使用过while循环来运行模拟,但是我目前正在自学purrr,非常喜欢能够将模拟数据,用于模拟的参数以及结果存储在同一环境中数据框。

我的问题是我想重复一个随机采样,直到达到一个标准为止,正如我目前已经实现的那样,这意味着我必须在数据框中添加行。

这是我当前拥有的代码:

library(tidyverse)
set.seed(1)
simulation_df =  crossing(sim_mean = 1, 
                          sim_sd = 2, 
                          final_sample_size =20, 
                          sim =1:10, 
                          collected_data = c(6,14)) %>%
  mutate(phase = if_else(collected_data == 6, 
                         "pilot", 
                         "full sample"),
    data =pmap(list(collected_data, # input to rnorm
                    sim_mean, 
                    sim_sd), 
               rnorm)) %>% # function to apply
  group_by(sim) %>% 
  # check if pilot was successful (ie 4 or more data points > 0)
 mutate( pilot_result = if_else(phase =="pilot",
                                map_dbl(data, ~ sum(. > 0)),
                                0 ),
         success_pilot = pilot_result >= 4) %>%
  ungroup()

(simulation_df %>% select(sim,phase, data, success_pilot) %>% head())
#> # A tibble: 6 x 4
#>     sim phase       data       success_pilot
#>   <int> <chr>       <list>     <lgl>        
#> 1     1 pilot       <dbl [6]>  FALSE        
#> 2     1 full sample <dbl [14]> FALSE        
#> 3     2 pilot       <dbl [6]>  TRUE         
#> 4     2 full sample <dbl [14]> FALSE        
#> 5     3 pilot       <dbl [6]>  TRUE         
#> 6     3 full sample <dbl [14]> FALSE

reprex package(v0.2.1)于2019-03-12创建

如果为success_pilot == FALSE,我想重复采样6个数据点,直到success_pilot == TRUE。通过确定最多要采样6个数据点的次数,然后过滤掉第一个success_pilot == TRUE之后的所有数据点,我可以以一种about回的方式实现这一点。

R for Data Science的“迭代”一章中,虽然提到了循环但没有涉及循环-我想知道是否有一个整洁的解决方案?

0 个答案:

没有答案