R语言批量下载SDSS光谱CSV文件及合并数据集方法咨询
R语言实现SDSS光谱数据批量下载与合并
1. 批量下载指定plate下多fibreid的CSV数据
SDSS的当前查询接口不支持通配符批量查询,你可以通过构造循环遍历目标fibreid列表的方式实现批量下载,同时可以增加异常处理逻辑避免单个fibreid下载失败导致整个任务中断,参考代码如下:
# 配置固定参数,按需替换为你需要的plateid、mjd值 target_plate <- 4055 target_mjd <- 55359 # 配置需要下载的fibreid范围,示例为1-100,可根据实际需求修改 target_fibreids <- 1:100 # 初始化列表存储所有下载结果 spec_data_list <- list() for (fid in target_fibreids) { # 拼接对应fibreid的查询URL request_url <- paste0( "https://dr14.sdss.org/optical/spectrum/view/data/format=csv/spec=full?", "mjd=", target_mjd, "&fiberid=", fid, "&plateid=", target_plate ) # 异常捕获,单个下载失败不终止整体任务 tryCatch({ spec_data_list[[as.character(fid)]] <- read.csv(request_url) message("fibreid=", fid, " 下载完成") }, error = function(err) { message("fibreid=", fid, " 下载失败,错误:", err$message) }) }
所有下载成功的光谱数据会存储在spec_data_list列表中,列表名对应fibreid值。
2. 多光谱表合并为统一数据集
在所有光谱的波长轴完全一致的前提下,可以提取公共波长列,再将各表的最佳拟合列按fibreid拼接为统一数据集,参考代码如下:
# 先过滤掉下载失败产生的空元素 spec_data_list <- Filter(NROW, spec_data_list) # 取第一个光谱的波长作为公共轴 merged_spec <- data.frame(wavelength = spec_data_list[[1]][, 1]) # 遍历所有光谱,提取最佳拟合列加入合并表 for (fid in names(spec_data_list)) { # 校验当前光谱波长是否与公共轴一致,避免数据错位 if (!all(spec_data_list[[fid]][, 1] == merged_spec$wavelength)) { warning("fibreid=", fid, " 波长与公共轴不匹配,已跳过") next } # 提取第三列(最佳拟合列)加入合并表,列名标记对应fibreid merged_spec[[paste0("fibre_", fid, "_best_fit")]] <- spec_data_list[[fid]][, 3] }
最终生成的merged_spec第一列为公共波长,后续每列对应一个fibreid的最佳拟合值。
内容的提问来源于stack exchange,提问作者Screamh
相关产品推荐
相关产品推荐

