我有一些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))
答案 0 :(得分:2)
仔细查看read.csv.sql
的文档,特别是参数nrows
:
nrows:用于确定列类型的行数。它默认为50.使用-1会导致它使用所有行来确定列类型。
通过查看read.csv.sql
和sqldf
的文档,您会注意到的另一件事是没有colClasses
参数。如果您阅读file.format
中的sqldf
文档,则会看到file.format
列表中的参数未传递给read.table
,而是传递给sqliteImportFile
,不了解R的数据类型。如果您不喜欢修改nrows
参数,则可以将整个数据框读取为具有字符类型,然后使用您喜欢的任何方法来确定哪个列应该是哪个类。在读取整个列之前,您总是会遇到不知道整数是整数还是数字的问题。此外,如果速度问题确实让你在这里遇到了麻烦,你可能需要考虑远离CSV。