【问题标题】:How to "fread" a list of files with a different number of columns?如何“读取”具有不同列数的文件列表?
【发布时间】:2021-06-20 07:02:59
【问题描述】:

通常,我会被引导读取格式相同、列数相同的文件列表。 我的功能看起来像:

fun.read <- function(files) {
  read <- function(filename){
    DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:7, col.names = c(...))
  }
  lst <- lapply(files, read)
}

效果很好。

但是现在,我必须这样做,假设我的文件没有相同数量的列。 例如,我这样做的方式是:

fun.read <- function(files) {
  read <- function(filename){
    if (max(count.fields(filename, sep = ";")) == 7) {
      DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:7, col.names = c(...))
    } else if (max(count.fields(filename, sep = ";")) == 8){
      DT <- data.table::fread(filename, header = FALSE, sep = ";", select = 1:8, col.names = c(...))
    }
  }
  lst <- lapply(files, read)
}

它似乎也可以正常工作,但我想知道是否没有更有效/更优雅的方式来做到这一点?

我查看了fill = TRUE 选项,但没有成功...

非常感谢!!

【问题讨论】:

  • 为什么要指定select = 1:7。如果您不指定,那么它将读取所有列。你不需要任何 if/else
  • 确实如此。 lapply(files, fread) 似乎是合乎逻辑的答案。
  • @akrun 我认为是因为 col.names。有时它是长度为 7 的向量,有时是长度为 8 的向量。
  • @Discus23 您只需要 Oliver 指定的代码。 sep 不需要,因为它会在 fread 中自动检测到
  • 老实说,我还没有测试过它。但是从帮助文件中它指出它使用前几行来检测分隔符(如果我没记错的话)。除非您的数据集非常大,否则这可能只是所花费时间的一小部分。

标签: r function data.table fread


【解决方案1】:

如果它可能对某人有帮助,以下是我减轻脚本的方法: 在col.names() 中包含if

x <- max(count.fields(filename, sep = ";"))
DT <- data.table::fread(filename, header = FALSE, sep = ";", col.names = c("...", "...", "...", if(x>3)"..."))

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多