data.table::fread 不喜欢第一列中的缺失值

Posted

技术标签:

【中文标题】data.table::fread 不喜欢第一列中的缺失值【英文标题】:data.table::fread doesn't like missing values in first column 【发布时间】:2014-05-23 15:37:28 【问题描述】:

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

考虑这个简单的例子,我有一个值表,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.

这是一个错误,还是第一列中不可能有缺失值(或者我是否有某种格式错误的数据?)。

【问题讨论】:

与***.com/questions/23436577/…重复 @GSee 我不认为这是重复的 - 相同的错误消息,但我没有看到该问题中的缺失值。我注意到 Ananda 提出的解决方案在这种情况下也不起作用。但是对于相关 r-forge 问题的链接很有用,谢谢! 现在...如何查看修订版 1180 ...?! 在命令末尾添加@1180svn checkout svn://svn.r-forge.r-project.org/svnroot/datatable/@1180 【参考方案1】:

我相信这与我报告 here 的错误相同。

我知道可以使用这种输入的最新版本是 Rev. 1180。您可以通过在 svn checkout 命令的末尾添加 @1180 来签出并构建该版本.

svn checkout svn://svn.r-forge.r-project.org/svnroot/datatable/@1180

如果您不熟悉签出和构建包,see here

但是,自 1180 版以来已经实现了许多出色的功能、错误修复和增强功能。(撰写本文时的开发版本是 1272 版)。因此,更好的解决方案是将R/fread.Rsrc/fread.c 文件替换为Rev. 1180 或更早的版本,然后重新构建包。

你可以在网上找到这些文件而不用在这里查看它们(抱歉,我不知道如何发布包含“*”的链接,所以你必须复制/粘贴):

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"

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

【讨论】:

以上是关于data.table::fread 不喜欢第一列中的缺失值的主要内容,如果未能解决你的问题,请参考以下文章

data.table fread错误 - gzip文件 - 设置临时目录

根据 Pandas 中另一列中的索引从列中获取数据

fread - 将所有列作为字符读取

移动设备上的 Woocommerce 产品页面 - “您可能也喜欢”错误地堆叠在一列中

Vroom/fread 不会读取 LARGE .csv 文件 - 无法对其进行内存映射

根据第一列中的字母数将行与上一行连接起来