2016-04-06 4 views
0

Я хочу построить кадр данных, прочитав в CSV-файле за каждый день месяца. Мои ежедневные файлы csv содержат столбцы символов, двойников и целых чисел из того же количества строк. Я знаю максимальное количество строк для каждого месяца, а количество столбцов остается одинаковым для каждого файла csv. Я Переберите каждый день месяца с fileListing, который содержит список имен CSV файлов (скажем, за январь):Прогрессивное добавление данных из read.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

+0

Возможно, вам лучше всего их прочитать в списке и использовать 'do.call (rbind.data.frame, data)', чтобы объединить их все сразу. –

ответ

1

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

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

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

затем укажите результат аргументу colClass.

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

На памяти уловок использования: Tricks to manage the available memory in an R session

С помощью функции сборщика мусора: Forcing garbage collection to run in R with the gc() command

+0

Я думал об этом, но я все же хочу написать ежемесячную коллекцию ежедневных файлов, так что второй день добавляется к нижней части первого дня данных в ежемесячном кадре данных. Спасибо. –

+0

Вставьте пару исправлений относительно colClass и nrow аргументов. Это поможет использовать время чтения и использование памяти. Использование rbind будет быстрым для наборов данных умеренного размера. – lmo

1

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

data <- lapply(fileListing, read.csv, header = FALSE, stringsAsFactors = FALSE, row.names = NULL) 
df <- do.call(rbind.data.frame, data) 
2

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

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 будет содержать все данные. Этот код можно улучшить, но для размера набора данных это должно быть достаточно быстро.

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

  • Нет связанных вопросов^_^