使用qqman包绘制曼哈顿图报错:invalid 'times' value求解
解决qqman包绘制曼哈顿图时的"invalid 'times' value"错误
这个错误的核心原因是manhattan()函数在尝试用rep.int()生成染色体位置标记时,传入了无效的“次数”参数——通常是因为你的数据中存在染色体(CHR)列无效值、SNP列缺失,或者部分染色体对应的SNP数量为0/NA,导致tapply(d$SNP, d$CHR, length)返回了非正整数或NA,进而触发rep.int()报错。
解决步骤
第一步:检查并清理染色体(CHR)列
染色体列不能有NA、非整数、0或负数,否则会导致分组统计异常。执行以下代码排查:# 查看CHR列的分布(包含NA) table(data$CHR, useNA = "always") # 统计NA数量 sum(is.na(data$CHR))清理无效行:
# 保留CHR为正整数且非NA的行 data = data[!is.na(data$CHR) & data$CHR > 0 & is.integer(data$CHR), ] # 若原CHR是数值型,先转整数 data$CHR = as.integer(data$CHR)第二步:检查并清理SNP列
SNP列不能有NA或空字符串,否则tapply()统计数量时会出错:# 查看SNP列的缺失情况 sum(is.na(data$SNP) | data$SNP == "")清理无效行:
data = data[!is.na(data$SNP) & data$SNP != "", ]第三步:验证染色体的SNP数量
确认每个染色体对应的SNP数量都是正整数,没有0或NA:chr_snp_counts = tapply(data$SNP, data$CHR, length) print(chr_snp_counts)如果存在数量为0的染色体,直接过滤掉这些染色体的行:
valid_chrs = names(chr_snp_counts[chr_snp_counts > 0]) data = data[CHR %in% valid_chrs, ]第四步:(可选但推荐)清理P值列
无效的P值(NA、<0或>1)会影响绘图效果,提前过滤:data = data[!is.na(data$Pval_Estimate) & data$Pval_Estimate >= 0 & data$Pval_Estimate <= 1, ]
修正后的完整代码
library(data.table) library(qqman) # 读取数据 data = fread("/z/Comp/lu_group/Members/jwlorge/ATN/scripts/data/temp_gwas/output_1/factor_1.txt", fill=TRUE, header=TRUE) # 数据类型转换 data$CHR = as.integer(data$CHR) data$BP = as.numeric(data$BP) data$Pval_Estimate = as.numeric(data$Pval_Estimate) # 批量过滤无效行 data = data[ !is.na(data$CHR) & data$CHR > 0 & !is.na(data$SNP) & data$SNP != "" & !is.na(data$Pval_Estimate) & data$Pval_Estimate >= 0 & data$Pval_Estimate <= 1, ] # 确认染色体SNP数量正常 print(tapply(data$SNP, data$CHR, length)) # 绘制曼哈顿图 jpeg('corrplot1.jpg') manhattan(data, chr="CHR", bp="BP", snp="SNP", p="Pval_Estimate") dev.off() # 绘制QQ图 jpeg('qqplot1.jpg') qq(data$Pval_Estimate) dev.off()
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

