【问题标题】:R data Import from a structured file从结构化文件导入 R 数据
【发布时间】:2025-12-19 22:25:16
【问题描述】:

我有一个如下所示的 txt 文件:

第一年:... 第 2 年:... …… …… [数据] 1,2,3,4 3,4,5 3,5,6,7,8,9 ...

所以基本上它会在[data] 行之前有n 行, 而数据线下面的就是我要读取的内容。

我知道我可以手动删除标题,但如果我可以让 R 检测到关键字 [data] 并阅读之后的内容,那将是理想的选择。

有什么建议吗?

另外,如您所见,对于实际数据,我在每一行都有不同数量的变量。
有什么方法可以读取它以保留行分隔符?

【问题讨论】:

    标签: r import


    【解决方案1】:

    一种方法:

    csvAfter <- function(file, marker="[data]", blank.lines.skip=FALSE) {
      lines <- readLines(file)
      i <- match(marker, lines)
      if (is.na(i)) {
        warning("Didn\'t find ", marker)
        return(NULL)
      }
      f <- textConnection(paste(lines[-(1:i)], collapse="\n"))
      on.exit(close(f), add=TRUE)
      return(read.csv(f, header=FALSE, fill=TRUE,
                      blank.lines.skip=blank.lines.skip))
    }
    

    例子:

    r <- "year 1: ...
    year 2: ...
    ....
    ....
    [data]
    1,2,3,4
    3,4,5
    3,5,6,7,8,9"
    print(csvAfter(textConnection(r)))
    

    【讨论】:

    • 如果有些行是空白的,我想将其作为 NA 读入怎么办?
    • 这对应于 read.csv 的 blank.lines.skip=FALSE。我已经按照您的要求修改了上面的代码来处理这种情况。
    【解决方案2】:

    上述答案非常适合自动检测标志“[data]”,这将使其适用于数据前具有不同行数的输入文件。

    如果您只需要这样做一次,您可以在调用 read.csv 或 read.table 时包含“skip =”

    例如,read.table(file, skip = n)

    【讨论】: