data.table::fread不喜欢在第一列中出现缺失值。

6

这是data.table::fread(版本1.9.2)的一个bug还是用户期望/错误错位?

考虑这个微不足道的例子,我有一个用制表符TAB分隔的值表,其中可能有缺失值。如果第一列中的值缺失,fread会感到不安,但是如果缺失值在其他地方,我会得到我期望的data.table

# Data with missing value in first column, third row and last column, second row:
12  876 19
23  39  
    15  20

fread("12   876 19
23  39  
    15  20")
#Error in fread("12\t876\t19\n23\t39\t\n\t15\t20") : 
#  Not positioned correctly after testing format of header row. ch='    '

# Data with missing values last column, rows two and three: 
"12 876 19
23  39  
15  20  "

fread( "12  876 19
23  39  
15  20  " )
#   V1  V2 V3
#1: 12 876 19
#2: 23  39 NA
#3: 15  20 NA
# Returns as expected.

这是一个bug吗,还是第一列中不可能有缺失值(或者我的数据存在格式问题)?


1
数据表fread位置错误的重复问题 - GSee
1
@GSee 我不认为这是一个重复的问题 - 虽然出现了相同的错误信息,但我在那个问题中没有看到缺失值。我注意到 Ananda 提出的解决方案在这种情况下也不适用。但感谢提供相关 r-forge 问题的链接! - Simon O'Hanlon
现在……如何检查版本 1180……?! - Simon O'Hanlon
1
将"@1180"添加到命令的末尾:svn checkout svn://svn.r-forge.r-project.org/svnroot/datatable/@1180 - GSee
1个回答

2
我相信这是我在这里报告过的同一个错误。
我知道最近可用于此类输入的版本是Rev. 1180。您可以通过在svn checkout命令的末尾添加@1180来检出并构建该版本。
svn checkout svn://svn.r-forge.r-project.org/svnroot/datatable/@1180

如果您不熟悉检查和构建软件包,请看这里
但是,自Rev. 1180以来,已经实现了许多出色的功能、错误修复和增强功能。(撰写本文时的开发版本为Rev. 1272)。因此,更好的解决方案是用Rev. 1180或更早版本的R/fread.Rsrc/fread.c文件替换它们,并重新构建软件包。
您可以在此处找到那些文件的在线版本(抱歉,我无法想出如何发布包含“*”的链接,所以您必须复制/粘贴)。

fread.R:
http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/R/fread.R?revision=988&root=datatable

fread.c:
http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/src/fread.c?revision=1159&root=datatable

一旦您重新构建了软件包,就可以读取您的 tsv 文件了。
> fread("12\t876\t19\n23\t39\t\n\t15\t20")
   V1  V2 V3
1: 12 876 19
2: 23  39 NA
3: NA  15 20

这样做的缺点是,旧版本的fread()无法通过较新的测试 -- 你将无法读取中间带有引号的字段。
> fread('A,B,C\n1.2,Foo"Bar,"a"b\"c"d"\nfo"o,bar,"b,az""\n')
Error in fread("A,B,C\n1.2,Foo\"Bar,\"a\"b\"c\"d\"\nfo\"o,bar,\"b,az\"\"\n") : 
  Not positioned correctly after testing format of header row. ch=','

使用更新版本的fread,你会得到这个结果。
> fread('A,B,C\n1.2,Foo"Bar,"a"b\"c"d"\nfo"o,bar,"b,az""\n')
      A       B       C
1:  1.2 Foo"Bar a"b"c"d
2: fo"o     bar   b,az"

因此,目前哪个版本“有效”取决于您更有可能在第一列中缺少值还是在字段中使用引号。对我来说,是前者,所以我仍在使用旧代码。

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