You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:15:02