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

R中for循环逐次追加抽样结果时新增列报错的修复方法

问题根源

代码存在4处错误触发报错:

  • 初始化结果存储tibble时末尾缺失闭合右括号,属于基础语法错误
  • 列名拼写不匹配:预定义的统计量列名为poisson.set,循环内计算时错写为possion.set,导致列对齐失败
  • 单物种抽样结果未添加对应的物种标识字段sp,拼接后缺失预期列
  • add_row()用法错误:该函数仅支持逐行传入列对应值,不能直接传入整表做批量拼接,嵌套调用会触发列校验报错
最小修正代码(基于原逻辑修改)
set.seed(111)
library(truncnorm)
library(tidyverse)
sample <- rtruncnorm(n = 1440,a = 0,b = 10,mean = 5,sd = 2)
sp <- rep(c("A","B","C","D"), each = 360)

df <- data.frame(sample, sp)

# 补全tibble初始化的闭合括号
output <- tibble(mean.set = numeric(), 
                 poisson.set = numeric(), 
                 sp = character(),
                 set = numeric())

set.seed(42)                    
for(i in 1:1440){
  # 修正poisson拼写,补充对应物种的sp字段
  samp1 <- df %>% filter(sp == 'A') %>% 
    sample_n(5, replace = TRUE) %>% 
    summarise(mean.set = mean(sample, na.rm=TRUE), 
              poisson.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% 
    mutate(set = i, sp = "A")
  
  samp2 <- df %>% filter(sp == 'B') %>% 
    sample_n(5, replace = TRUE) %>% 
    summarise(mean.set = mean(sample, na.rm=TRUE), 
              poisson.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% 
    mutate(set = i, sp = "B")
  
  samp3 <- df %>% filter(sp == 'C') %>% 
    sample_n(5, replace = TRUE) %>% 
    summarise(mean.set = mean(sample, na.rm=TRUE), 
              poisson.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% 
    mutate(set = i, sp = "C")
  
  samp4 <- df %>% filter(sp == 'D') %>% 
    sample_n(5, replace = TRUE) %>% 
    summarise(mean.set = mean(sample, na.rm=TRUE), 
              poisson.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% 
    mutate(set = i, sp = "D")
  
  # 直接用bind_rows拼接,移除错误的add_row嵌套
  output <- bind_rows(output, samp1, samp2, samp3, samp4)
}

# 调整列顺序和预期输出一致
output <- output %>% select(set, mean.set, poisson.set, sp)
优化版代码(消除重复逻辑)

原代码重复编写4次完全一致的抽样计算逻辑,后续修改统计量容易漏改,可以通过封装函数+分组计算简化:

set.seed(111)
library(truncnorm)
library(tidyverse)

sample <- rtruncnorm(n = 1440,a = 0,b = 10,mean = 5,sd = 2)
sp <- rep(c("A","B","C","D"), each = 360)
df <- data.frame(sample, sp)

# 封装单组单次抽样计算逻辑
calc_boot_stat <- function(sub_df, boot_num){
  sub_df %>% 
    sample_n(5, replace = TRUE) %>% 
    summarise(
      mean.set = mean(sample, na.rm = TRUE),
      poisson.set = (var(sample, na.rm = TRUE) / mean(sample, na.rm = TRUE)^2) - (1 / mean(sample, na.rm = TRUE))
    ) %>% 
    mutate(set = boot_num)
}

set.seed(42)
# 按物种分组批量完成所有重复抽样
output <- df %>% 
  group_by(sp) %>% 
  group_map(~map_dfr(1:1440, ~calc_boot_stat(.x, .y)), .keep = TRUE) %>% 
  list_rbind(names_to = "sp") %>% 
  select(set, mean.set, poisson.set, sp)

运行后输出结果完全符合set、mean.set、poisson.set、sp四字段的格式要求。

内容的提问来源于stack exchange,提问作者Rspacer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:18:19