使用Qmap进行偏差校正时出现列索引越界报错的技术求助
qmap偏差校正代码报错排查与解决
我正在尝试用qmap包的偏差校正方法处理数据,但运行代码时出现报错,代码如下:
library("qmap") library("readxl") library("zoo") library("lattice") setwd("C:/Users/gen-tya-gradrhi/Desktop/Tesis/Excel") Milpo <- read_xlsx("Milpo.xlsx", col_names = TRUE) Milpo <- na.omit(Milpo) MilpoPISCO <- read_xlsx("Milpo_PISCO.xlsx", col_names = TRUE) MilpoPISCO <- na.omit(MilpoPISCO) qm.fit <- fitQmapQUANT(Milpo[,2], MilpoPISCO[,2], qstep=0.1, nboot=1, wet.day = TRUE) qm.a <- doQmapQUANT(MilpoPISCO[,2], qm.fit, type="linear") qm.s <- doQmapQUANT(MilpoPISCO[,2], qm.fit, type="tricub") sqrtquant <- function(x, qstep=0.01){ qq <- quantile(x, prob=seq(0, 1, by=qstep)) sqrt(qq) } plot(sqrtquant(MilpoPISCO[,2]), sqrtquant(Milpo[,2]))
报错信息
Error in `x[order(x, na.last = na.last, decreasing = decreasing)]`: ! Can't subset columns past the end. ℹ Locations 19, 23, 25, …, 724, and 213 don't exist. ℹ There is only 1 column. Run `rlang::last_error()` to see where the error occurred. Warning message: In xtfrm.data.frame(x) : cannot xtfrm data frames
问题分析
报错核心有两点:
- 列索引越界:代码中用
Milpo[,2]和MilpoPISCO[,2]尝试访问第2列,但实际读取的Excel文件对应的数据集只有1列。 - 数据类型不匹配:
quantile()函数需要传入向量,但Milpo[,2]在只有1列时会返回数据框,而非向量,进而触发xtfrm.data.frame的警告和后续索引错误。
解决方案
检查并确认数据结构
先运行以下代码查看数据集的列数和结构:str(Milpo) str(MilpoPISCO)如果输出显示只有1列,说明Excel文件中只有目标数据列,需调整索引方式。
提取向量而非数据框
修改代码中提取数据的部分,用[[ ]]代替[, ],确保返回的是向量而非数据框:# 提取单列为向量 Milpo_vec <- Milpo[[1]] MilpoPISCO_vec <- MilpoPISCO[[1]]修正核心函数调用
将所有用到数据集列的地方替换为提取后的向量:qm.fit <- fitQmapQUANT(Milpo_vec, MilpoPISCO_vec, qstep=0.1, nboot=1, wet.day = TRUE) qm.a <- doQmapQUANT(MilpoPISCO_vec, qm.fit, type="linear") qm.s <- doQmapQUANT(MilpoPISCO_vec, qm.fit, type="tricub")完善自定义函数
在sqrtquant函数中添加数据类型判断,避免传入数据框时出错:sqrtquant <- function(x, qstep=0.01){ # 若传入的是数据框,自动提取第一列向量 if(is.data.frame(x)) x <- x[[1]] qq <- quantile(x, prob=seq(0, 1, by=qstep)) sqrt(qq) }修正绘图代码
plot(sqrtquant(MilpoPISCO_vec), sqrtquant(Milpo_vec))
额外提示
如果设置了wet.day = TRUE,需确认数据中存在大于0的数值(即湿天数据),否则拟合过程可能出现异常。
内容的提问来源于stack exchange,提问作者César Carvallo
相关产品推荐
相关产品推荐

