正确理解复制()函数的用法



我有以下功能:

library(dplyr)
var_1 <- rnorm(100, 10, 10)
var_2 <- rnorm(100, 1, 10)
var_3 <- rnorm(100, 5, 10)
response <- rnorm(100, 1, 1)
my_data <- data.frame(var_1, var_2, var_3, response)
my_data$id <- 1:100
simulate <- function() {
results <- list()
results2 <- list()
for (i in 1:100) {
iteration_i <- i
sample_i <- my_data[sample(nrow(my_data), 10), ]
results_tmp <- data.frame(iteration_i, sample_i)
results[[i]] <- results_tmp
}
results_df <- do.call(rbind.data.frame, results)
test_1 <- data.frame(results_df %>% 
group_by(id) %>% 
filter(iteration_i == min(iteration_i)) %>% 
distinct)
summary_file <- data.frame(test_1 %>% 
group_by(iteration_i) %>% 
summarise(Count=n()))
cumulative <- cumsum(summary_file$Count)
summary_file$Cumulative <- cumulative
summary_file$unobserved <- 100 - cumulative
return(summary_file)
}
当我调用这个函数时,我得到以下输出:
> head(simulate())
iteration_i Count Cumulative unobserved
1           1    10         10         90
2           2     7         17         83
3           3    10         27         73
4           4     5         32         68
5           5     7         39         61
6           6     8         47         53

我想尝试运行这个函数10次,并将所有结果附加到一个文件中。我尝试使用"复制()"来做到这一点。函数-但这不起作用:

# Method 1 : Did not work
n_replicates = 10
iterations_required <- replicate(n_replicates, {
simulate() 
})
# Method 2: Did not work
lapply(seq_len(10), simulate(1))
# Method 3: Did Not Work
library(purrr)
rerun(10, simulate(1))
# Method 4: Did Not Work
lapply(seq_len(10), simulate)

理想情况下,我希望得到这样的东西:

# works fine!
results <- list()
for (i in 1:10) { 
game_i <- i
s_i <- simulate()
results_tmp <- data.frame(game_i, s_i)
results[[i]] <- results_tmp
}
final_file <- do.call(rbind.data.frame, results)

我的问题:"方法1、方法2、方法3、方法4"是否有原因?我们不工作-有人能告诉我如何解决这个问题吗?

# Method 1 : 
n_replicates = 10
iterations_required <- replicate(n_replicates, {
simulate() 
}, simplify=FALSE)
# Method 2: 
iterations_required<-lapply(seq_len(10), function(x) simulate(1))
# Method 4: 
iterations_required<-lapply(seq_len(10), simulate)
# to merge into one data.frame
as.data.frame(data.table::rbindlist(iterations_required, idcol=TRUE))

或者,如果您将函数修改为simulate(i),其中i将是输出中的第一列(interinterindex)。然后你可以使用do.call(rbind.data.frame, lapply(seq_len(n_replicates), simulate))

replicate默认尝试在矩阵中简化结果。所以诀窍就是不要去simplify

n_replicates<- 10
iterations_required <- replicate(n_replicates, simulate(), simplify=FALSE)

最新更新