R语言approx函数使用xout参数时返回全NA问题求解
问题根源
你的错误核心是approx()函数的参数传参逻辑完全错误:
approx(x, y)的标准用法中,x是固定的自变量(你场景下就是波长wl),y是需要插值的因变量(你场景下是pt_1、pt_2对应的反射率值)- 你用
apply按列遍历整个数据集,把每一列的值都当成x传入approx,当处理pt_1、pt_2列时,x的取值是反射率的数值,你传入的xout是波长的数值,绝大多数不在反射率的取值范围内,自然返回全量NA。 - 你之前不加
xout仅指定n时看似正常,实际得到的是错误结果:输出的不是波长维度的插值,而是每个列自身数值排序后的等分插值,完全不符合你的需求。
另外注意你提供的pt_2列存在明显异常值,比如279、57、3446,和其他反射率的量级差了上千倍,如果是输入笔误建议先修正再做插值,否则插值结果会受异常值严重影响。
正确实现代码
1. 指定自定义波长点插值
# 固定自变量为波长列 x_wl <- mydata$wl # 自定义需要插值的波长点 target_wl <- c(450, 550, 670, 700, 704, 706, 740.5, 750, 950, 1510) # 对所有反射率列批量插值 interp1 <- data.frame(wl = target_wl) ref_cols <- setdiff(colnames(mydata), "wl") for (col in ref_cols) { interp1[[col]] <- approx(x = x_wl, y = mydata[[col]], method = "linear", xout = target_wl)$y }
2. 保留原始波长点位同时增加插值点
wl_orig <- mydata$wl # 合并原始波长和新增插值波长,去重后排序更符合使用习惯 xout_all <- sort(unique(c(wl_orig, 450, 550, 670, 700, 704, 706, 740.5, 750, 950, 1510))) # 批量插值所有反射率列 interp_all <- data.frame(wl = xout_all) ref_cols <- setdiff(colnames(mydata), "wl") for (col in ref_cols) { interp_all[[col]] <- approx(x = x_wl, y = mydata[[col]], method = "linear", xout = xout_all)$y }
内容的提问来源于stack exchange,提问作者MonkeyCousin
相关产品推荐
相关产品推荐

