R语言如何重复执行函数并保存输出结果用于后续绘图
R语言循环迭代计算分组抽样后的ID频率实现方案
首先提前加载所需依赖包:
library(tidyverse)
方案1:修正版for循环实现
你之前的for循环大概率是没有在每次迭代时更新待处理数据集,以下是可直接运行的实现:
# 设定循环次数,示例中为4次 n_iter <- 4 # 初始化列表存储每次的频率结果 freq_results <- list() # 初始化当前处理数据集为原始数据 current_dat <- dat for (i in 1:n_iter) { # 步骤1:每个plot分组删除1条随机条目 current_dat <- current_dat %>% group_by(plot) %>% slice_sample(n = n() - 1) %>% # dplyr 1.0+版本推荐写法,旧版本可替换为sample_n(n() -1) ungroup() # 步骤2:计算当前ID频率 freq_res <- current_dat %>% group_by(ID) %>% summarise(n = n(), .groups = "drop") %>% mutate(freq = n / sum(n)) # 保存本次结果到列表 freq_results[[i]] <- freq_res }
执行完成后,freq_results[[1]]对应第一次删除后的频率结果,freq_results[[4]]对应第4次删除后的频率结果。
方案2:purrr函数式编程实现(更简洁)
如果习惯tidyverse的函数式写法,可不用显式编写for循环:
n_iter <- 4 freq_results <- accumulate(1:n_iter, ~ .x %>% group_by(plot) %>% slice_sample(n = n()-1) %>% ungroup(), .init = dat) %>% tail(-1) %>% # 去掉初始的原始数据条目 map(~ .x %>% group_by(ID) %>% summarise(n = n(), .groups = "drop") %>% mutate(freq = n/sum(n)))
结果合并(可选)
如果需要把所有迭代的结果合并为单个数据框方便后续分析,可执行以下代码:
all_freq <- bind_rows(freq_results, .id = "iteration") # iteration列取值1~4,对应第几次删除操作后的结果
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

