如何调试data.table中「不允许负长度向量」的报错问题
问题:data.table melt函数报错“negative length vectors are not allowed”
问题场景
使用data.table::melt处理全量data.table对象时触发报错,但处理数据子集可正常运行。
执行代码:
modern_gt_melted <- data.table::melt(modern_gt, id.vars = c('chrom', 'pos', 'ref', 'alt'))
报错信息:
Error in melt.data.table(gtData, c("chrom", "pos", "ref", "alt")) : negative length vectors are not allowed
数据样例
# modern_gt chrom pos ref alt Nea HG01566 NA18593 NA19795 HG01105 HG03225 1: chr20 10723 T . 67 66 66 66 66 66 2: chr20 10724 G . 67 66 66 66 66 66 3: chr20 10725 C . 67 66 66 66 66 66 4: chr20 10726 C . 67 66 66 66 66 66 5: chr20 10727 T . 67 66 66 66 66 66
已尝试操作
- 测试数据子集:前10000行可正常melt,全量数据报错
# 正常运行 data.table::melt(modern_gt[1:10000, ], id.vars = c('chrom', 'pos', 'ref', 'alt')) # 全量运行报错 data.table::melt(modern_gt, id.vars = c('chrom', 'pos', 'ref', 'alt')) - 执行数据去重操作,问题未解决
modern_gt <- unique(modern_gt)
可行解决方案
检查数据列的异常值与类型
全量数据报错大概率是某列存在异常值(如负长度向量、非法NA/Inf值),先排查非id列的状态:# 查看所有列的类型 sapply(modern_gt, class) # 统计非id列的异常值数量 lapply(modern_gt[, -c('chrom', 'pos', 'ref', 'alt'), with=FALSE], function(x) sum(is.infinite(x) | is.nan(x)))升级data.table版本
旧版data.table的melt函数可能存在大数据量下的bug,升级到最新稳定版:install.packages("data.table")分块处理后合并结果
若升级无效,可拆分数据为小批量处理,再合并结果:# 按行分块 chunks <- split(modern_gt, ceiling(seq_len(nrow(modern_gt))/10000)) # 逐个分块melt后合并 melted_list <- lapply(chunks, function(x) data.table::melt(x, id.vars = c('chrom', 'pos', 'ref', 'alt'))) modern_gt_melted <- data.table::rbindlist(melted_list)替换异常值
若排查到异常值,批量替换为合法值:# 遍历非id列,将Inf/NaN替换为NA for(col in setdiff(names(modern_gt), c('chrom', 'pos', 'ref', 'alt'))){ data.table::set(modern_gt, which(is.infinite(modern_gt[[col]]) | is.nan(modern_gt[[col]])), col, NA) }
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

