2013-07-18 2 views
0

У меня есть CSV-файлы с проблемными столбцами для sqldf, в результате чего некоторые числовые столбцы классифицируются как символы. Как я могу просто указать классы для этих столбцов, а не для каждого столбца? Есть много столбцов, и я не обязательно хочу указать класс для всех из них.Как я могу указать только некоторые colClasses в sqldf file.format?

Значительная часть данных в этих столбцах проблем - это нули, поэтому sqldf считывает их как целочисленные, когда они являются числовым (или реальным) типом данных. Обратите внимание, что read.csv правильно назначает классы. Я не достаточно умен, чтобы создать подходящий набор данных, который имеет правильные свойства (первые 50 значений равно нулю, то значение, скажем, 1,45 в 51-м ряду), но вот пример вызова для загрузки данных:

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)) 

ответ

2

Присмотрись к документации для read.csv.sql, в частности, в аргументе nrows:

nrows: Number of rows used to determine column types. It defaults to 50. Using -1 causes it to use all rows for determining column types.

Еще одна вещь, которую вы заметите при рассмотрении документации для read.csv.sql и sqldf, заключается в том, что нет параметра colClasses. Если вы прочитали документ file.format в sqldf, вы увидите, что параметры в списке file.format не передаются в read.table, а скорее в sqliteImportFile, который не имеет представления о типах данных R. Если вам не нравится изменять параметр nrows, вы можете прочитать весь файл данных как имеющий тип символа, а затем использовать любые методы, которые вам нравятся, выяснить, какой столбец должен быть тем классом. У вас всегда будет проблема не знать, является ли целое число или числовым, пока вы не прочитаете весь столбец. Кроме того, если проблема скорости действительно убивает вас здесь, вы можете подумать о переходе от CSV.

+0

Спасибо, я глупо предположил, что аргумент был каким-то образом похож на nrows read.csv и прошел мимо него. Тем не менее, с большим файлом, использование -1 добавляет некоторое время на вызов. Жаль, что я не смог ее решить, используя colClasses. –

Смежные вопросы