2012-10-10 46 views
13

我在若干案件中看出,虽然read.table()是无法读取制表符分隔的文件(例如微阵列的注释表)返回以下错误:read.csv函数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()

+1

又读内存使用情况下'read.table()'的帮助页面为什么它对于大文件可能显得很慢。 – Chase

+1

我们无法回答您的(更新)问题,但没有可重复的示例。最常见的读取问题是(1)未检测到注释字符,(2)不匹配的引号,(3)当fill = TRUE时,文件的前5行后每行的字段数发生变化。因为'read.csv'和'read.table'对'comment','quote'和'fill'有不同的默认值,所以这些都可能是问题。 –

+1

PS有8个'comment' /'quote' /'fill'的组合:你可以尝试所有这些组合,看看结果如何不同 - 这可能会导致你的答案。 'count.fields()'也可以用于诊断。 –

回答

26

read.csv围绕read.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在下面的评论中指出,为read.table()帮助页面说一样多Details下:

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.

+6

好的答案 - 我只是补充说,'read.table()'的帮助页面同样详细说明了'read.csv和read.csv2与read.table完全相同,除了默认值。它们用于读取'逗号分隔值'文件('.csv')或(read.csv2),该国家使用逗号作为小数点和分号作为字段分隔符。所以对于OP来说 - 是的,当你的数据与'read.csv'的默认值不匹配时,你会希望'read.table' – Chase

+0

刚刚更新了问题 – Ali

8

不要使用read.table阅读制表符分隔的文件,使用read.delim。 (这仅仅是围绕read.table瘦包装,但它设置的选项为适当的值)

0

read_table()做失败的某个选项卡上的sep“编辑文件和设置sep='\s+'可能有助于假设项目在表中已经没有空间