Постепенное добавление данных из read.csv

Я хочу построить фрейм данных, читая в CSV-файл для каждого дня в месяце. Мои ежедневные csv-файлы содержат столбцы символов, двойных чисел и целых чисел с одинаковым количеством строк. Я знаю максимальное количество строк для любого данного месяца, и количество столбцов остается неизменным для каждого файла CSV. Я перебираю каждый день месяца с помощью fileListing, который содержит список имен файлов CSV (скажем, за январь):

output <- matrix(ncol=18, nrow=2976)
for ( i in 1 : length( fileListing ) ){
    df = read.csv( fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL )
    # each df is a data frame with 96 rows and 18 columns

    # now insert the data from the ith date for all its rows, appending as you go
        for ( j in 1 : 18 ){        
            output[ , j ]   = df[[ j ]]
        }
}

Извините, что пересмотрел мой вопрос, поскольку я выяснил его часть (да), но должен ли я использовать rbind для постепенной вставки данных внизу фрейма данных, или это медленно?

Спасибо.

BSL

3 ответа

Решение

Если данные довольно малы относительно вашей доступной памяти, просто прочитайте данные и не беспокойтесь об этом. После того, как вы прочитали все данные и выполнили некоторую очистку, сохраните файл с помощью save() и прочитайте сценарии анализа в этом файле с помощью load(). Отделение сценариев чтения / очистки от аналитических клипов является хорошим способом решения этой проблемы.

Особенность для ускорения чтения read.csv заключается в использовании аргументов nrow и colClass. Поскольку вы говорите, что знаете количество строк в каждом файле, то, сказав R, это поможет ускорить чтение. Вы можете извлечь классы столбцов, используя

colClasses <- sapply(read.csv(file, nrow=100), class)

затем передайте результат аргументу colClass.

Если данные становятся слишком большими, вы можете рассмотреть возможность обработки отдельных файлов и сохранения промежуточных версий. На сайте обсуждается ряд вопросов, связанных с управлением памятью, которые охватывают эту тему.

Об приемах использования памяти: приемы управления доступной памятью в сеансе R

Об использовании функции сборщика мусора: принудительное выполнение сборки мусора в R с помощью команды gc()

Сначала определите основной кадр данных для хранения всех данных. Затем, когда каждый файл прочитан, добавьте данные в мастер.

masterdf<-data.frame()
for ( i in 1 : length( fileListing ) ){
  df = read.csv( fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL )
  # each df is a data frame with 96 rows and 18 columns
  masterdf<-rbind(masterdf, df)
}

В конце цикла masterdf будет содержать все данные. Этот код может быть улучшен, но для размера набора данных это должно быть достаточно быстро.

Вы можете прочитать их в список с lapplyзатем объедините их все сразу:

data <- lapply(fileListing, read.csv, header = FALSE, stringsAsFactors = FALSE, row.names = NULL)
df <- do.call(rbind.data.frame, data)
Другие вопросы по тегам