如何在“data.table::fread”中同时使用col.name和colclass?
作为一个简单的例子,我写的如何在“data.table::fread”中同时使用col.name和colclass?,r,csv,data.table,R,Csv,Data.table,作为一个简单的例子,我写的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=“
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]]
一种可能的解决方案是使用列的索引,而不是名称
data.table::fread("cars.csv", col.names = c("a","b"), colClasses = list(numeric = 1))
似乎
data.table
在col.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
是自动检测第一列的名称。似乎是唯一的方法,但从用户的角度来看很糟糕。此解决方案仅适用于没有列名称的数据,而“变通方法”也适用于具有列名称的数据。我不认为“V1”比使用1有什么改进,因为在这两种情况下,您都需要知道列的位置。@kath,我想说的主要一点是解释为什么会发生这种错误。data.table首先解析colClasses参数以读取数据,然后设置col.name。一旦我们知道原因,我们就知道如何解决问题。这两种方法都是次要的。我同意你的回答更优雅。“V1”是自动断开的。如果数据有标题,我们可以用标题中相应的值替换“V1”。