0

我有一些 CSV 文件的 sqldf 列有问题,导致一些数字列被归类为字符。我怎样才能只为这些列指定类,而不是每一列?有很多列,我不一定要为所有列指定类。

这些问题列中的大部分数据都是零,因此当它们是数字(或实数)数据类型时,sqldf 将它们读取为整数。请注意, read.csv 正确分配了类。我不够聪明,无法生成具有正确属性的合适数据集(前 50 个值为零,然后在第 51 行中的值为 1.45),但这是一个加载数据的示例调用:

df <- read.csv.sql("data.dat", sql="select * from file",  
                   file.format=list(colClasses=c("attr4"="numeric")))

返回此错误:

Error in sqldf(sql, envir = p, file.format = file.format, dbname = dbname,  :
   formal argument "file.format" matched by multiple actual arguments

我可以以某种方式使用另一个 read.table 调用来计算数据类型吗?我可以将所有列作为字符读取,然后将一些转换为数字吗?有一小部分数字是字符,与所有数字列相比,指定这些数字会更容易。我想出了这个丑陋的部分解决方案,但它仍然在最后一行失败并显示相同的错误消息:

df.head <- read.csv("data.dat", nrows=10)
classes <- lapply(df.head, class)  # also fails to get classes correct
classes <- replace(classes, classes=="integer", "numeric")
df <- read.csv.sql("data.dat", sql="select * from file",  
                   file.format=list(colClasses=classes))
4

1 回答 1

2

仔细查看文档read.csv.sql,特别是参数nrows

nrows:用于确定列类型的行数。它默认为 50。使用 -1 会导致它使用所有行来确定列类型。

从查看文档中您会注意到的另一件事read.csv.sqlsqldf,没有colClasses参数。如果您阅读 中的file.format文档sqldf,您会看到file.format列表中的参数不是传递给read.table而是传递给sqliteImportFile,它不了解 R 的数据类型。如果您不喜欢修改nrows参数,您可以将整个数据框读取为具有字符类型,然后使用您喜欢的任何方法来确定哪一列应该是什么类。但是,在阅读整列之前,您总是会遇到不知道整数是整数还是数字的问题。此外,如果速度问题真的让你死了,你可能要考虑远离 CSV。

于 2013-07-18T15:46:43.150 回答