【问题标题】:How do I use col.names and colClasses together in `data.table::fread`?如何在 `data.table::fread` 中同时使用 col.names 和 colClasses?
【发布时间】:2020-01-06 23:49:36
【问题描述】:

作为一个简单的例子,我写了cars,没有列名。

data.table::fwrite(cars, "cars.csv", col.names = FALSE)

然后我尝试使用列名并通过指定列的类型a 来读取它们

data.table::fread("cars.csv", col.names = c("a","b"),
                  colClasses = list(a = "numeric"))

我得到了这个错误

data.table::fread("cars.csv", col.names = c("a", "b"), colClasses = list(a = "numeric")) : 列名 'numeric' 在 colClasses[[1]] 未找到

【问题讨论】:

    标签: r csv data.table


    【解决方案1】:

    一种可能的解决方案是使用列的索引而不是名称。

    data.table::fread("cars.csv", col.names = c("a","b"), colClasses = list(numeric = 1))
    

    【讨论】:

    • 似乎是唯一的方法,但从用户的角度来看很糟糕。
    【解决方案2】:

    似乎data.tablecol.names 之前处理colClasses 参数。因此,除了其他答案提供的解决方法外,还有两种替代方法:

    # option1: A character vector of classes
    fread("cars.csv", colClasses = c(V1 = "numeric"), col.names = c("a","b"))
    
    # option2: Or a named list of vectors of column names or numbers
    fread("cars.csv", colClasses = list(numeric = "V1"), col.names = c("a","b"))
    

    这里,V1 是自动检测到的第一个列的名称。

    【讨论】:

    • 此解决方案仅适用于没有 col.names 的数据,而“解决方法”也适用于带有 colnames 的数据。我没有看到“V1”比使用 1 的改进,因为在这两种情况下你都需要知道列的位置。
    • @kath,我想说的主要一点是解释为什么会发生这种错误。 data.table 首先解析 colClasses 参数以读取数据并稍后设置 col.names。一旦我们知道原因,我们就知道如何解决问题。这两种替代方式是次要的。我同意你的回答更优雅。 “V1”是自动检测的。如果数据有header,我们可以将“V1”替换为header中对应的值。
    猜你喜欢
    • 2015-04-20
    • 2013-09-13
    • 2021-06-15
    • 2014-02-08
    • 2013-10-14
    • 2014-08-16
    • 2018-03-18
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多