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

