2015-03-06 5 views
1

Я определил функцию для обработки каждого файла csv и возвращает матрицу. Я хотел бы использовать эту функцию в цикле for для обработки всех файлов и объединения всех данных в одну большую матрицу. Но, похоже, этот код не работает.Как преобразовать несколько матриц в одну большую матрицу

filenames=dir() 

bigMatrix = processEachCSV(filenames[1]) 

for (i in 2:length(filenames1)) { 
    x = processEachCSV(filenames[i]) 
    bigMatrix=rbind[bigMatrix,x] 
} 

Я думаю, это потому, что я не могу rbind х и bigMatrix и присвоить его bigMatrix себя?

Что мне делать вместо этого?

Функции processEachCSV как это:

processEachCSV <- function (filename){ 

    x = read.table(filename, header=F, sep=',', fileEncoding='UTF-8') 
    x$V4=as.numeric(gsub("[^0-9.]",'', as.character(x$V4))) 
    x$V5=as.numeric(gsub("[^0-9.]",'', as.character(x$V5))) 
    x$V6=substr(filename, 1, nchar(filename)-4) 
    colnames(x)=c('DateTime','Site','AQI','PM25','PM10','City') 
    x=as.matrix(x) 
    return (x) 
} 
+1

Прочитайте все файлы в виде 'list', а затем используйте' do.call (rbind, yourList) '. – A5C1D2H2I1M1N2O1R2T1

+0

Вы понимаете, что для использования 'rbind' вам нужно использовать'() ', а не' [] ', правильно? – A5C1D2H2I1M1N2O1R2T1

ответ

3

Основной подход будет что-то вроде:

do.call(rbind, lapply(filenames, read.csv)) 

Настройки read.csv части с, что вы на самом деле делать с processEachCSV функции (если это действительно функция).


В качестве альтернативы, вы можете посмотреть на некоторых из rbind_list функции от «dplyr» или rbindlist функций от «data.table», оба из которых являются более эффективными, чем do.call(rbind, ...). В таком случае результат не будет matrix, но вы можете легко преобразовать его в матрицу.

+0

Да, процесс EachCSV действительно является функцией. Поэтому я попробовал это «do.call (rbind, lapply (имена файлов, processEachCSV())), но, похоже, имя файла не было передано функции processEachCSV. – user3768495

+0

Я также пытался преобразовать имена файлов из символьного вектора в список, используя do.call (rbind, lapply (as.list (имена файлов), processEachCSV())). Не работает. – user3768495

+0

@ user3768495, вы должны попробовать 'do.call (rbind, lapply (filenames, processEachCSV))'. Не добавляйте '()' в 'processEachCSV'. Однако, не зная, что именно делает 'processEachCSV', мне было бы трудно гарантировать, что то, что я предлагаю, будет работать. Кроме того, все ли файлы имеют одинаковое количество столбцов? – A5C1D2H2I1M1N2O1R2T1

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

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