那些年遇到的R语言的坑之科学计数法

最近因为疫情的原因一直呆在家里,然后突然一个师兄找我要了个bed文件,然后我就从服务器上down下来给了他。但很快师兄就反馈说这个bed文件加载不到IGV里面去。一直出现这个报错

然后我心里想,不应该啊,我之前明明从服务器上down到我的台式机上,然后成功用IGV加载了的,虽然里面的数据可能不太一样了,但应该都是一样的bed。为啥到他电脑就不行了,于是我强行启动我笔记本的IGV,结果也出现了报错。面对这种报错,我的第一反应是可能是IGV的版本不对,于是我重新下了最新的IGV,发现还是一样的错误。
然后我就懵逼了,只能去上网搜,网上只有有限几个类似的报错
- BED Parsing errors are more cryptic than they should be
- Error parsing line at byte position when uploading bed file
其中只有第二个是成功解决了的,他里面说
I figured out what was wrong. In one of the bed line, the address was written in scientific form. That’s why IGV is throwing out an error.
对于 scientific form,我还是不太懂……所以我只能祭出最后一招,逐行逐行地去看bed文件(开玩笑的:))。我按顺序大块大块地部分复制了我原来那个bed文件,形成新的bed,载入IGV中,终于被我发现了有问题的那一行

然后终于跟之前对起来了,原来是科学计数法惹的祸。因为R会对一些大数字运用科学计数法,从而导致了40000变成了4e+05。而之前我一直没报错是因为我之前的bed文件很幸运地没有大的整数。
至于怎么解决这个问题,上网搜下就行。比如说你可以在输出bed的时候,设置下格式
write.table(format(merge_peak,scientific=FALSE), file = "result/processed_result/merge_peak.bed", quote = F,sep = "\t", row.names = F, col.names = F,)
也可以一开始就options下,比如说下面的意思就是在200个位以内不要使用科学计数法
options(scipen = 200)
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!