运行 当 read.table 在 R 中有 5 个或更多的第一个空行时进入错误“文件的空开头”

Run into error “empty beginning of file” when read.table in R with 5 or more first empty lines

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

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

我怎样才能让我的文件有尽可能多的空行,并获得适当数量的 NA 行?

如果有任何帮助和建议,我将不胜感激。谢谢!

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

如果您只键入 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)

这里的重点是什么?要知道您可以访问大多数函数的代码并理解它们为何如此运行。

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

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

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