Повторение функции и запись результатов для каждого прогона - PullRequest
1 голос
/ 01 ноября 2019

У меня есть функция, и я хочу запустить ее несколько раз, каждый раз, когда переменная 'draw', равная 19, увеличивается на единицу вплоть до 52. И после каждого запуска я хочу записывать результаты, используя summary ()на «сим» и положить его в DF. Мне было интересно, как я мог бы использовать цикл в этом сценарии, чтобы мне не приходилось каждый раз входить и менять значение розыгрыша и записывать свои результаты msnaully? Желаемые результаты:

draw  Min  1st Qu. Median Mean    3rd Qu. Max.
19    16    27      30    29.85    33     45
20    22    30      33    33.13    37     50u
21
.
.
52

Код:


library(dplyr)

N      <- 2500
d      <- data.frame(id = 1:N)
draw   <- 19     ## changing variable 
n      <- 22       
n_runs <- 500


sim <- c()

set.seed(123)
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 <- all %>%
    group_by(id) %>%
    mutate(freq = n()) %>%
    filter(freq > 1) %>%
    n_distinct(id) %>%
    as.data.frame()
  sim <- bind_rows(sim, repeats)
}

summary(sim)

1 Ответ

1 голос
/ 01 ноября 2019

Да, у вас что-то работает, и вам нужно записать это в функцию.

Эта часть вашего кода просто ищет, сколько уникальных идентификаторов появляется более одного раза:

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 :)Надеюсь, это то, что вам нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...