19

我在几种情况下看到,虽然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()在任何情况下使用吗?

4

3 回答 3

32

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

特别是,这是 的完整定义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 在下面的评论中read.table()所说,帮助页面在下面的内容中也有同样的说明Details

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

于 2012-10-10T21:18:43.067 回答
10

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

于 2012-10-10T23:00:18.610 回答
0

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

于 2014-06-20T14:26:45.280 回答