簡體   English   中英

正確理解replicate()函數的使用

[英]Correctly Understanding the Use of the replicate() function

我有以下功能:

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 次並將所有結果附加到一個文件中。 我嘗試使用“replicate()”函數來做到這一點——但這不起作用:

# 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將是輸出中的第一列(交互索引)。 然后你可以使用do.call(rbind.data.frame, lapply(seq_len(n_replicates), simulate))

默認情況下, replicate嘗試簡化矩陣中的結果。 所以訣竅實際上就是不要simplify

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM