fread不能将裸的加号或减号识别为字符字段

3

我正在尝试对一些大小约为2GB的文件进行fread操作,这些文件看起来像这样:

head file.bed
chr1    19922471        19924471        +       NM_001204088    tss     1       0
chr1    19922471        19924471        +       NM_001204088    tss     2       0
chr1    19922471        19924471        +       NM_001204088    tss     3       0
chr1    19922471        19924471        +       NM_001204088    tss     4       0
chr1    19922471        19924471        +       NM_001204088    tss     5       0
chr1    19922471        19924471        +       NM_001204088    tss     6       0
chr1    19922471        19924471        +       NM_001204088    tss     7       0
chr1    19922471        19924471        +       NM_001204088    tss     8       0
chr1    19922471        19924471        +       NM_001204088    tss     9       0
chr1    19922471        19924471        +       NM_001204088    tss     10      0

第四列也有相似数量的“-”。在R中读取时,“+/-”会变成0:

cov.data <- fread(file)
head(cov.data)
     V1       V2       V3 V4           V5  V6 V7 V8
1: chr1 19922471 19924471  0 NM_001204088 tss  1  1
2: chr1 19922471 19924471  0 NM_001204088 tss  2  1
3: chr1 19922471 19924471  0 NM_001204088 tss  3  1
4: chr1 19922471 19924471  0 NM_001204088 tss  4  1
5: chr1 19922471 19924471  0 NM_001204088 tss  5  1
6: chr1 19922471 19924471  0 NM_001204088 tss  6  0

我查阅了文档,但是没能找出原因。有什么建议吗?由于fread仍在开发中,所以这可能是一个bug吗?

2个回答

4

两件事:

首先,如果您的文件包含引号,也就是说,如果您的 strand 列为 "+""-",那么来自 data.table 版本 1.8.8 的 fread 将正确读取。

其次,data.table 版本 1.8.9 中已经纠正了这个问题,您可以使用以下命令进行安装:

install.packages("data.table",repos="http://R-Forge.R-project.org", type="source")

如果需要,您可以安装 devtools ,然后使用 dev_mode(TRUE)进入开发模式,然后在那里安装 data.table ,以便不会妨碍 data.table 1.8.8 的正常运行。
从1.8.9的相关更改日志的复制/粘贴:
NEW FEATURES
o  fread :
   * If some column names are blank they are now given default names rather than causing
       the header row to be read as a data row. Thanks to Simon Judes for suggesting.

   * "+" and "-" are now read as character rather than integer 0. Thanks to Alvaro Gonzalez for reporting.
   https://dev59.com/U2_Xa4cB1Zd3GeqP25p0

....

我怀疑很少有人会遇到这种行为,但很高兴听到它已经被修复了。 - Matthew Lundberg
@MatthewLundberg,是的。我想主要是生物信息学家/计算生物学家。我也遇到了同样的问题。 - Arun
感谢@Arun。很高兴听到这个问题已经解决了,因为fread将在每个文件中节省几分钟的时间。关于你的问题,我的原始文件上没有引用+和-,你猜对了:我是一名生物信息学家 :) - fridaymeetssunday

3
似乎静态函数Strtollfread.c(在data.table 1.8.8源代码中)扫描前导的+-,并确保至少消耗了一个字符以确定它是否已经扫描到整数。
然后,逻辑从0的累加器开始,将其乘以10并添加每个数字。未发现非数字,因此该函数返回TRUE。
看起来像是一个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接