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
相关产品推荐
相关产品推荐

