R中的read.table有5个或更多的第一空行时遇到错误“文件的空开头”

时间:2019-01-25 23:42:46

标签: r read.table

我正在尝试打开一个* .txt文件,该文件以'n'个空行开头,并且我希望将空行视为NA

我正在使用read.table()函数和blank.lines.skip = FALSE参数。 如果空行数少于5,则文件将以正确的NA行数正确打开,但是如果文件中有5行或更多空行,则会出现以下错误:empty beginning of file

如何允许我的文件具有任意数量的空行并获得正确数量的NA行?

非常感谢您的帮助和建议。谢谢!

2 个答案:

答案 0 :(得分:2)

这似乎是该函数的预期行为:

如果您只键入read.table,您将看到该函数的代码。在总长度的大约四分之一处,您会发现 5 (以任意方式)被选择为认为该文件为空的行数的阈值。我复制了函数的一部分:

pbEncoding <- if (encoding %in% c("", "bytes", "UTF-8")) 
        encoding
    else "bytes"
    numerals <- match.arg(numerals)
    if (skip > 0L) 
        readLines(file, skip)
    nlines <- n0lines <- if (nrows < 0L) 
        5
    else min(5L, (header + nrows))
    lines <- .External(C_readtablehead, file, nlines, comment.char, 
        blank.lines.skip, quote, sep, skipNul)
    if (encoding %in% c("UTF-8", "latin1")) 
        Encoding(lines) <- encoding
    nlines <- length(lines)
    if (!nlines) {
        if (missing(col.names)) 
            stop("no lines available in input")
        rlabp <- FALSE
        cols <- length(col.names)

else if (missing(col.names)) 
            col.names <- paste0("V", 1L:cols)
        if (length(col.names) + rlabp < cols) 
            stop("more columns than column names")
        if (fill && length(col.names) > cols) 
            cols <- length(col.names)
        if (!fill && cols > 0L && length(col.names) > cols) 
            stop("more column names than columns")
        if (cols == 0L) 
            stop("first five rows are empty: giving up")
    }
    if (check.names) 
        col.names <- make.names(col.names, unique = TRUE)

这里的重点是什么?要知道您可以阅读大多数功能的代码,并了解它们为何如此行事。

答案 1 :(得分:1)

正如PavoDive所提到的,数字 5 被硬编码到基本R函数read.table的定义中。如果您确实想读空白行,则需要制作一个使用其他值的函数的临时版本。

这是一种方法。在控制台中输入fix(read.table)。在RStudio中,这将打开另一个窗口,向您显示read.table后面的代码,并允许您进行更改。将第34行中的 5 更改为大于文件中前导空白行数的数字。例如,我将其更改为 6

screenshot of Edit window

当您点击“保存”时,您将在当前的R环境中看到一个名为read.table的临时函数。 (如果删除该对象,清除环境或重新启动R会话,则read.table的临时修改版本将消失,并且您将返回使用read.table的原始基本R版本的{5} 34.)现在尝试读取文件。它应该能够将您的文件读入具有适当数量的前导空白行的表中。