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

使用missMethyl读取idat文件报错:指定文件不存在问题咨询

甲基化芯片IDAT文件读取错误排查与修复

问题背景

需求:仅保留文件名第一个下划线前子串重复的IDAT文件(例如abc_xyz_123.idat与abc_xyz_456.idat属于有效配对),同时匹配sample.sheet和clin.info中的Sample.ID字段。

当前执行代码:

library(missMethyl)
matched.filenames <- sample.sheet$File.Name[match(clin.info$Sample.ID, sample.sheet$Sample.ID)]
filename.substr <- stringr::str_extract(matched.filenames, "[^_]*")
clin.info$Basename <- file.path(paste0(getwd(), "/idat"), filename.substr)
sample.sheet$Basename <- clin.info$Basename[match(clin.info$Sample.ID, sample.sheet$Sample.ID)]
sample.sheet <- sample.sheet[!(is.na(sample.sheet$Basename)) || !(duplicated(sample.sheet$Basename))]
clin.info <- clin.info[clin.info$Sample.ID %in% sample.sheet$Sample.ID,]
rgSet <- read.metharray.exp(targets=clin.info)

报错信息

执行时触发文件不存在错误,具体提示:

Error in read.metharray(basenames = files, extended = extended, verbose = verbose, : 
  The following specified files do not exist:
[Basename列所有值]

错误原因分析

  1. Basename格式不匹配:read.metharray.exp要求的Basename是IDAT文件的完整前缀(即去掉_Grn.idat/_Red.idat的部分),但当前代码仅提取了文件名第一个下划线前的子串,和实际文件前缀完全不符。
  2. 路径拼接逻辑错误:手动拼接getwd()和/idat会导致路径分隔符异常,file.path本身已支持自动处理分隔符,无需额外拼接。
  3. 样本筛选逻辑反向:!(is.na(sample.sheet$Basename)) || !(duplicated(sample.sheet$Basename))会保留非NA或非重复的样本,和“保留第一个下划线前子串重复的配对”需求完全相反。

修正代码

library(missMethyl)
library(stringr)

# 1. 匹配Sample.ID,关联对应文件名
matched_idx <- match(clin.info$Sample.ID, sample.sheet$Sample.ID)
matched.filenames <- sample.sheet$File.Name[matched_idx]

# 2. 生成正确的Basename:提取IDAT文件完整前缀,拼接合法路径
filename_prefix <- str_remove(matched.filenames, "\\.idat$")
clin.info$Basename <- file.path(getwd(), "idat", filename_prefix)
# 提取第一个下划线前的子串用于筛选配对
clin.info$prefix_sub <- str_extract(filename_prefix, "[^_]*")

# 3. 筛选出第一个下划线前子串重复的样本(即有效配对)
repeat_sub_counts <- table(clin.info$prefix_sub)
valid_substrings <- names(repeat_sub_counts[repeat_sub_counts >= 2])
clin.info <- clin.info[clin.info$prefix_sub %in% valid_substrings, ]

# 4. 同步更新sample.sheet
sample.sheet <- sample.sheet[sample.sheet$Sample.ID %in% clin.info$Sample.ID, ]
sample.sheet$Basename <- clin.info$Basename[match(sample.sheet$Sample.ID, clin.info$Sample.ID)]

# 5. 提前验证IDAT文件是否存在(红绿通道都需存在)
missing_flag <- !file.exists(paste0(clin.info$Basename, "_Grn.idat")) | !file.exists(paste0(clin.info$Basename, "_Red.idat"))
if (any(missing_flag)) {
  warning("以下样本的IDAT文件缺失:", paste(clin.info$Sample.ID[missing_flag], collapse = ", "))
  clin.info <- clin.info[!missing_flag, ]
}

# 6. 读取甲基化数据
rgSet <- read.metharray.exp(targets = clin.info)

关键修正说明

  • Basename生成逻辑:提取完整的IDAT文件前缀(去掉.idat后缀),确保和实际的_Grn.idat/_Red.idat文件前缀完全匹配。
  • 筛选逻辑修正:统计第一个下划线前子串的出现次数,仅保留出现≥2次的子串对应的样本,符合配对需求。
  • 路径优化:使用file.path自动处理路径分隔符,避免手动拼接导致的格式错误。
  • 前置验证:提前检查红绿通道IDAT文件是否存在,避免后续读取报错。

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:17:00