我正在运行模拟,过去使用过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的“迭代”一章中,虽然提到了循环但没有涉及循环-我想知道是否有一个整洁的解决方案?