如何在sqldf file.format中仅指定一些colClasses?

时间:2013-07-18 11:01:48

标签: r import sqldf

我有一些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))

1 个答案:

答案 0 :(得分:2)

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

  

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

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