Как я могу указать только некоторые colClasses в файле sqldf.format?

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

Большая часть данных в этих проблемных столбцах — нули, поэтому 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))

person a different ben    schedule 18.07.2013    source источник


Ответы (1)


Внимательнее изучите документацию по read.csv.sql, особенно по аргументу nrows:

nrows: количество строк, используемых для определения типов столбцов. По умолчанию он равен 50. Использование -1 заставляет использовать все строки для определения типов столбцов.

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

person nwknoblauch    schedule 18.07.2013
comment
Спасибо, я по глупости предположил, что этот аргумент чем-то похож на строки read.csv, и пропустил его. Тем не менее, с большим файлом использование -1 увеличивает время вызова. Жаль, что я не смог решить это с помощью colClasses. - person a different ben; 19.07.2013