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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:54:08