Постепенное добавление данных из 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)