2017-01-16 1 views
1

В папке у меня есть 24 * .csv-файлы, они имеют одинаковую структуру, и я хочу создать один файл. Проблема в том, что не все кадры данных считываются одинаково, потому что для некоторых файлов параметр sep является «,» и для других «;». Какой подход следует использовать? Вероятно, я могу поставить if-statement.Чтение нескольких текстовых файлов в r без одного и того же разделителя

+1

'data.table :: fread' удобен, если вы чувствуете себя слишком ленив, чтобы указать разделители, и ваши данные достаточно хорошо сформированы. Как правило, подход заключается в том, чтобы «скрыть» функцию чтения по вектору имен файлов и «do.call (rbind, ...)» (или dplyr или data.table) результат. – alistaire

+0

@Ariel Глупый вопрос, но не возможно просто просто найти или заменить массу для ';' разделитель, чтобы все файлы были согласованными? Если это всего лишь одно, то это может быть самый простой подход. Если вам приходится иметь дело с ним на постоянной основе, подумайте о кодировании файлов, чтобы вы знали, какой разделитель использовать. –

+0

@MatthewCrews - это возможность, но в случае десятичного значения en в данных есть «,» вместо «.». Это может быть проблемой. – Ariel

ответ

2

Вы можете проверить первую строку фрейма данных, чтобы увидеть, если он имеет запятую или точку с запятой в качестве разделителя, и после вызова IfElse заявление:

L <- readLines('DataFrame', n = 1) 
if (grepl(";", L)) read.csv2("DataFrame") else read.csv("DataFrame") 
1

Следующий простой код сделал работу, и очень быстро ,

library(dplyr) 
library(data.table) 
files <- list.files(path = "Ariel/Trips/", full.names = T) 
f <- list() 
for (i in 1:length(files)) { 
f[[i]] <- fread(files[i], header = T, colClasses = c("factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor", 
                "factor", "integer", "integer", "integer", 
                "factor", "numeric", "numeric", "integer", 
                "factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor")) 
} 
trip <- bind_rows(f) 
fwrite(x = trip, file = "trip.csv", quote = T, na = NA, row.names = F) 
+1

Если вы планируете делать больше с data.frames, чем просто переписывать их в новый файл, 'fread' создает по умолчанию таблицу data.table, которая подмножества по-разному; если это вызывает беспокойство, используйте параметр 'data.table = FALSE'. Вы также можете использовать 'data.table :: rbindlist' вместо' dplyr :: bind_rows', если хотите использовать меньшее количество пакетов. Кроме того, 'lapply', скорее всего, будет быстрее, чем цикл' for', поскольку по умолчанию он предварительно выделяет память. – alistaire

+0

* ... какие подмножества по-разному .. * довольно расплывчато .. также недавно это поведение было исправлено (по большей части) .. где можно использовать DT [, cols], чтобы вести себя как DF (предполагая 'cols' не существует в DT), или 'DT [, ..cols]', чтобы искать 'cols' (который является символом char/integer имен столбцов/индексов) вне области' DT'. См. [Пункт 2 в разделе v1.10.0 и пункт 1 под v1.9.8] (https://github.com/Rdatatable/data.table/blob/master/NEWS.md). – Arun

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