Как связать несколько матриц в одну большую матрицу

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

filenames=dir()

bigMatrix = processEachCSV(filenames[1])

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

Я думаю, это потому, что я не могу связать x и 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)
}

person user3768495    schedule 06.03.2015    source источник
comment
Прочитайте все файлы как list, а затем используйте do.call(rbind, yourList).   -  person A5C1D2H2I1M1N2O1R2T1    schedule 06.03.2015
comment
Вы понимаете, что для использования rbind вам нужно использовать (), а не [], верно?   -  person A5C1D2H2I1M1N2O1R2T1    schedule 06.03.2015


Ответы (1)


Основной подход будет примерно таким:

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

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


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

person A5C1D2H2I1M1N2O1R2T1    schedule 06.03.2015
comment
Да, processEachCSV действительно является функцией. Итак, я попробовал это «do.call (rbind, lapply (имена файлов, processEachCSV ()))», но, похоже, имя файла не было передано функции processEachCSV. - person user3768495; 06.03.2015
comment
Я также попытался преобразовать имена файлов из вектора символов в список, используя do.call(rbind, lapply(as.list(filenames'), processEachCSV())). Тоже не работал. - person user3768495; 06.03.2015
comment
@ user3768495, попробуйте do.call(rbind, lapply(filenames, processEachCSV)). Не добавляйте () к processEachCSV. Однако, не зная, что именно делает processEachCSV, мне было бы трудно гарантировать, что то, что я предлагаю, сработает. Кроме того, все ли файлы имеют одинаковое количество столбцов? - person A5C1D2H2I1M1N2O1R2T1; 06.03.2015
comment
Я тоже пытался не использовать () и все еще не работал. Все файлы имеют 6 столбцов, я проверил... Я обновил свой вопрос, чтобы показать вам функцию. Благодарю вас! - person user3768495; 06.03.2015
comment
@ user3768495, я полагаю, это не связано с проблемой, но почему вы используете matrix, когда ваши столбцы включают разные типы данных? Почему вы не используете data.frame? - person A5C1D2H2I1M1N2O1R2T1; 06.03.2015
comment
Я думаю, что проблема в части lapply (имя файла, processEachCSV). Получил сообщение об ошибке: «Ошибка в read.table (имя файла, заголовок = F, sep =,, fileEncoding = UTF-8): нет доступных строк во входных данных» - person user3768495; 06.03.2015
comment
кстати, как ты сделал некоторые слова выделенными серым цветом? - person user3768495; 06.03.2015
comment
@user3768495, используйте обратные кавычки ` - person A5C1D2H2I1M1N2O1R2T1; 06.03.2015
comment
Наконец-то я понял, что это из-за того, что некоторые из моих файлов пусты.filenames <- filenames[file.info(filenames)$size > 1] помог мне! - person user3768495; 06.03.2015