【问题标题】:read.csv vs. read.tableread.csv 与 read.table
【发布时间】:2017-02-24 23:50:33
【问题描述】:

我在几种情况下看到read.table() 无法读取制表符分隔的文件(例如微阵列的注释表)返回以下错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line xxx did not have yyy elements

read.csv() 在同一个文件上完美运行,没有错误。我认为read.csv() 的速度也高于read.table()

甚至更多:read.table() 正在非常疯狂地阅读我的文件。它在读取第 100 行时出现此错误,但是当我将第 90 行到第 110 行复制并粘贴到同一文件的开头之后,它仍然会出现第 100+21 行的错误(在开头复制了新行)。如果该行有任何问题,为什么它在读取开头粘贴的行时不报告该错误?我确认read.csv() 读取同一个文件没有错误。

您知道为什么read.table() 无法读取read.csv() 处理的相同文件吗?还有任何理由使用read.table()吗?

【问题讨论】:

  • 另请阅读read.table() 的帮助页面,了解内存使用情况,了解为什么它对于大文件可能看起来很慢。
  • 如果没有可重现的示例,我们无法回答您的(更新的)问题。最常见的阅读问题是(1)未检测到的注释字符,(2)不匹配的引号,(3)fill=TRUE 时文件前 5 行之后每行字段数的变化。因为read.csvread.tablecommentquotefill 有不同的默认值,所以这些都可能是问题所在。
  • PS 有 8 种组合 comment/quote/fill:您可以尝试所有这些组合,看看结果有何不同——这可能会引导您找到答案。 count.fields() 也便于诊断。
  • 我遇到过的每一位 R 专家的集体经验使我为此类问题开发了先验,该问题基本上由 Dirac Delta 函数组成,在“有一条奇怪的线/文件中的字符”,read.tableread.csv 没有问题。
  • 我不知道如何在 SO 上共享文件

标签: r file-io read.table read.csv


【解决方案1】:

read.csvread.table 的一个相当薄的包装器;如果您无法通过向read.table 提供正确的参数来完全复制read.csv 的行为,我会感到非常惊讶。但是,其中一些参数(例如处理引号或注释字符的方式)很可能会改变函数的速度和行为。

特别是,这是read.csv完整定义:

function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) {
     read.table(file = file, header = header, sep = sep, quote = quote, 
        dec = dec, fill = fill, comment.char = comment.char, ...)
}

如前所述,它只是带有一组特定选项的 read.table

正如@Chase 在下面的 cmets 中所说,read.table() 的帮助页面在Details 下也有同样的说明:

read.csv 和 read.csv2 与 read.table 相同,但默认值除外。它们用于读取“逗号分隔值”文件 (‘.csv’) 或 (read.csv2) 在使用逗号作为小数点和分号作为字段分隔符的国家/地区使用的变体。

【讨论】:

  • 好答案 - 我只想补充一点,read.table() 的帮助页面在详细信息read.csv and read.csv2 are identical to read.table except for the defaults. They are intended for reading ‘comma separated value’ files (‘.csv’) or (read.csv2) the variant used in countries that use a comma as decimal point and a semicolon as field separator. 下也说了很多。所以对于 OP - 是的,当您的数据与 read.csv 的默认值不匹配时,您会想要 read.table
【解决方案2】:

不要使用read.table 来读取制表符分隔的文件,使用read.delim。 (它只是read.table 的一个薄包装,但它将选项设置为适当的值)

【讨论】:

    【解决方案3】:

    read_table() 在选项卡 sep'ed 文件上有时会失败,设置 sep='\s+' 可能有助于假设表中的项目没有空间

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2014-03-15
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多