重复一个函数并记录每个 运行 的结果
Repeating a function and recording the results for each run
我有一个函数,我想 运行 它多次,每次 19 的变量 'draw' 增加 1,一直增加到 52。在每个 运行 我想通过在 'sim' 上使用 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)
是的,您有一些工作需要将其写入函数。
您的这部分代码只是简单地寻找有多少唯一 ID 出现不止一次:
repeats <- all %>%
group_by(id) %>%
mutate(freq = n()) %>%
filter(freq > 1) %>%
n_distinct(id) %>%
as.data.frame()
您可以将其简化为:
sum(table(all$id)>1)
在不改变太多的情况下,您的函数将如下所示,我将 "all" 替换为 ALL 因为 "all" 是 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)
应该会得到与上面完全相同的结果。现在您使用 map 应用此函数,仅更改 draw:
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 :) 希望这是你需要的
我有一个函数,我想 运行 它多次,每次 19 的变量 'draw' 增加 1,一直增加到 52。在每个 运行 我想通过在 'sim' 上使用 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)
是的,您有一些工作需要将其写入函数。
您的这部分代码只是简单地寻找有多少唯一 ID 出现不止一次:
repeats <- all %>%
group_by(id) %>%
mutate(freq = n()) %>%
filter(freq > 1) %>%
n_distinct(id) %>%
as.data.frame()
您可以将其简化为:
sum(table(all$id)>1)
在不改变太多的情况下,您的函数将如下所示,我将 "all" 替换为 ALL 因为 "all" 是 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)
应该会得到与上面完全相同的结果。现在您使用 map 应用此函数,仅更改 draw:
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 :) 希望这是你需要的