Я выполняю симуляции, и в прошлом я использовал циклы while для запуска моей симуляции, но в настоящее время я учусь мурлыкать и очень люблю хранить симулированные данные, параметры, используемые для симуляции, и результаты в одном и том же фрейм данных.
Моя проблема в том, что я хотел бы повторять случайную выборку до тех пор, пока не будет достигнут критерий, что, как я реализовал в настоящее время, означает, что мне придется добавлять строки в мой массив данных.
Вот код, который у меня сейчас есть:
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
Создано в 2019-03-12 пакетом представ. (v0.2.1)
Если success_pilot == FALSE
, я бы хотел повторить выборку из 6 точек данных до success_pilot == TRUE
. Я мог бы реализовать это окольным путем, выбрав максимальное количество раз, которое я выбрал бы для 6 точек данных, а затем отфильтровал все точки данных после первого success_pilot == TRUE
.
В главе Итерации в R для Data Science , хотя циклы упоминаются, но не рассматриваются - мне было интересно, есть ли для этого аккуратное решение?