Да, у вас что-то работает, и вам нужно записать это в функцию.
Эта часть вашего кода просто ищет, сколько уникальных идентификаторов появляется более одного раза:
repeats <- all %>%
group_by(id) %>%
mutate(freq = n()) %>%
filter(freq > 1) %>%
n_distinct(id) %>%
as.data.frame()
И вы можете упростить это до:
sum(table(all$id)>1)
Не меняя слишком много того, что у вас есть, ваша функция будет выглядеть следующим образом, я заменил «все» на ВСЕ, потому что «все» - это функция в R:
func = function(draw,d,n,n_runs){
sim <- c()
for (j in 1:n_runs) {
ALL <- c()
for (i in 1:draw) {
srs <- sample_n(d, n, replace = FALSE)
ALL <- bind_rows(ALL, srs)
}
repeats <- sum(table(ALL$id)>1)
sim <- c(sim, repeats)
}
summary(sim)
}
Для проверки вы делаете:
set.seed(123)
func(19,data.frame(id=1:2500),22,500)
Должен дать вам точно такой же результат, как указано выше. Теперь вы применяете эту функцию, используя карту, изменяя только рисование:
library(purrr)
library(dplyr)
set.seed(123)
res = 19:22 %>% map(func,data.frame(id=1:2500),22,500)
cbind(19:22,do.call(rbind,res))
Я не запускал все 19:52, потому что это слишком медленно .. Вы можете попытаться оптимизировать код, не делая так много bind_rows :)Надеюсь, это то, что вам нужно