R语言循环中b被赋值为29的原因?索引与向量长度不匹配排查
R循环索引错误导致数据框行数不匹配问题
修改后的循环代码
n_range <- 4:29 bResultsStra <- vector("double", 27) for (b in n_range) { bRowsStra<-Stratified[sample(nrow(Stratified), b), ] base <- read.table("base.csv", header=T, sep=",") base$area<-5036821 base$quadrea <- base$area * 16 bootStra <- boot(data=bRowsStra$count, average, R=1000) base$data<- bootStra$t base$popsize<-(base$data*base$quadrea) basesortStra <- base[order(base$popsize),] bValue <- basesortStra$popsize[975] - basesortStra$popsize[25] bResultsStra[[b - 1]] <- bValue }
原始代码片段(修改前)
n_range <- 2:29 bResultsStra <- vector("double", 29)
遇到的错误
运行后尝试将结果存入data.frame时触发错误:
Error in data.frame(n = n_range, bResultsStra) :
arguments imply differing number of rows: 26, 28
问题原因分析
- 向量长度初始偏差:
n_range <- 4:29的实际长度是26(29-4+1=26),但手动创建的bResultsStra长度设为27,从一开始就不匹配。 - 索引赋值逻辑错误:循环中用
bResultsStra[[b - 1]] <- bValue赋值,当b从4开始时,b-1=3,也就是从向量第3位开始写入;当b=29时,b-1=28,但原向量只有27个元素,R会自动把bResultsStra扩展为28个元素——最终导致bResultsStra长度28,n_range长度26,创建数据框时行数不匹配。 - 循环变量的正常行为:循环结束后
b的值为29L是R的正常机制,循环变量会保留最后一次迭代的取值,并非bug。
修正方案
- 动态匹配向量长度:用
length(n_range)代替手动计算的数值,确保向量长度和n_range完全一致:bResultsStra <- vector("double", length(n_range)) - 改用循环索引定位:避免用
b的值来确定向量位置,改用循环的索引序号,彻底解决偏移问题:n_range <- 4:29 bResultsStra <- vector("double", length(n_range)) for (i in seq_along(n_range)) { b <- n_range[i] bRowsStra<-Stratified[sample(nrow(Stratified), b), ] base <- read.table("base.csv", header=T, sep=",") base$area<-5036821 base$quadrea <- base$area * 16 bootStra <- boot(data=bRowsStra$count, average, R=1000) base$data<- bootStra$t base$popsize<-(base$data*base$quadrea) basesortStra <- base[order(base$popsize),] bValue <- basesortStra$popsize[975] - basesortStra$popsize[25] bResultsStra[[i]] <- bValue }
内容的提问来源于stack exchange,提问作者PeterLL
相关产品推荐
相关产品推荐

