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

R语言while循环处理iris数据集运行报错如何解决

错误原因

代码报错核心是sample()函数用法错误:
iris是按行存储观测、按列存储变量的数据框,你直接写sample(iris, replace = TRUE, 30)时,R会把数据框识别为「列构成的列表」,默认对列做抽样,根本不是你想要的抽观测样本行。
这么抽出来的结果是随机选的列,大概率不包含Sepal.Length列,甚至会抽到Species这种因子类型的非数值列,此时你取num_1_i$Sepal.Length会得到空值,mean()计算空值就会触发你看到的警告:argument is not numeric or logical: returning NA。等运行到while()的逻辑判断步骤时,ctotal_i已经是NA了,没法判断TRUE/FALSE,就会抛出对应的错误。

修复方案

对iris做行抽样(也就是抽观测样本)不要直接给sample()传整个数据框,用基础R实现的话,先抽样行索引,再根据索引取对应行即可。
修复后的完整可运行代码如下:

list_results <- list()
for (i in 1:100){
  # 初始化参数
  ctotal_i = c1_i = c2_i = c3_i = 0
  
  while(ctotal_i < 20 ){
    # 修正抽样逻辑:每次抽取30个行索引,取对应行作为随机样本
    idx1 <- sample(nrow(iris), size = 30, replace = TRUE)
    num_1_i <- iris[idx1, ]
    
    idx2 <- sample(nrow(iris), size = 30, replace = TRUE)
    num_2_i <- iris[idx2, ]
    
    idx3 <- sample(nrow(iris), size = 30, replace = TRUE)
    num_3_i <- iris[idx3, ]
    
    # 计算三个样本的Sepal.Length均值和总和
    c1_i = mean(num_1_i$Sepal.Length)
    c2_i = mean(num_2_i$Sepal.Length)
    c3_i = mean(num_3_i$Sepal.Length)
    ctotal_i = c1_i + c2_i + c3_i
  }
  
  inter_results_i <- data.frame(i, c1_i, c2_i, c3_i, ctotal_i)
  list_results[[i]] <- inter_results_i
}

# 如需合并所有迭代结果为单个数据框,可执行下面这行
final_result <- do.call(rbind, list_results)

补充说明:由于iris数据集整体的Sepal.Length均值约为5.84,三个30样本的均值总和在17.5上下浮动,实际运行时while循环可能需要1-几次抽样才能满足总和大于20的阈值条件,属于正常现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:30:49