R: Ошибка с функцией 'rbind' при попытке добавить кадры данных, преобразованные из файлов CSV - PullRequest
0 голосов
/ 23 сентября 2019

Данные: Папка диска, содержащая данные, может быть загружена здесь: specdata .Папка содержит 332 файла с разделенными запятыми (CSV) файлами, содержащими данные мониторинга загрязнения воздуха мелкодисперсными частицами (ТЧ) в 332 местах в Соединенных Штатах.Каждый файл содержит данные с одного монитора, а идентификационный номер каждого монитора содержится в имени файла.Например, данные для монитора 200 содержатся в файле «200.csv».Каждый файл содержит три переменные.Дата: дата наблюдения в формате (год-месяц-день), сульфат: уровень содержания сульфатов в воздухе в эту дату (измеряется в микрограммах на кубический метр) и нитраты: уровень нитратов в воздухе.на эту дату (измеряется в микрограммах на кубический метр)

Цель Напишите функцию с именем 'pollutantmean', которая вычисляет среднее значение загрязнителя (сульфата или нитрата) по указанному списку мониторов.Функция «pollutantmean» принимает три аргумента: «каталог», «загрязнитель» и «id».Учитывая идентификационные номера векторных мониторов, 'pollutantmean' считывает данные мониторинга твердых частиц из каталога, указанного в аргументе 'directory', и возвращает среднее значение загрязнителя по всем мониторам, игнорируя все пропущенные значения, закодированные как NA.

Сценарий:

pollutantmean <- function(directory,pollutant, id) {
  originaldir = getwd()
  setwd(paste(getwd(),"/",directory,sep = "")) ##assuming the needed folder (i.e specdata in this case) is present in originaldir
  samples <- dir()
  master.data.frame <- data.frame(matrix(data=NA,nrow=2,ncol=4)) ##creating an empty data frame with number of columns equal to the csv files and random number of rows.
  if (pollutant == "Sulphate") {
    pollutant.index = 2   ## assigning column number for sulphate
  } else {
    pollutant.index = 3   ## assigning column number for nitrate
  }
  for (i in id) {
    files <- as.data.frame(read.csv(samples[i]))
    master.data.frame <- rbind(master.data.frame,files)
  }

  means <- colMeans(master.data.frame[pollutant.index],na.rm = TRUE)
  setwd(originaldir)
  print(means)
}

Вызов функции:

pollutantmean("specdata","sulphate",1:10)

Сообщение об ошибке

Error in match.names(clabs, names(xi)) : 
  names do not match previous names 
5. stop("names do not match previous names") 
4. match.names(clabs, names(xi)) 
3. rbind(deparse.level, ...) 
2. rbind(master.data.frame, files) 
1. pollutantmean("specdata", "sulphate", 1:10) 

Цель состоит в том, чтобы создать фрейм основных данных со всеми показаниями из всех файлов CSV, а затем отфильтровать его по столбцам и без значений NA с помощью функции colMeans.Вот где код распадается.

Пожалуйста, дайте мне знать, как устранить ошибку.

1 Ответ

0 голосов
/ 23 сентября 2019

Проблема в том, что ваш начальный фрейм данных не имеет тех же имен столбцов, что и те, которые читаются из ваших файлов.Вы можете сконструировать его с правильными именами, но гораздо проще, чтобы оно было NULL и инициализировалось следующим образом:

master.data.frame <- NULL

Конечно, r2evans абсолютно прав, что повторное связывание неэффективно.Но это может быть достаточно хорошо - вы решаете для своего приложения.

И некоторые нежелательные замечания:

Я бы не стал использовать setwd и вместо этого построил бы правильный путь к данным, используя file.path и использовать это в read.csv.

Я бы также попытался избежать адресации столбцов data.frame по числовому индексу и использовать вместо них имена столбцов.

Наконец - read.csv уже возвращает data.frame - не нужно его приводить.

Вот немного исправленная версия:

pollutantmean <- function(directory, pollutant, id) {
    master.data.frame <- NULL
    allfiles <- list.files(directory)
    for (i in id) {
        thisfile <- read.csv(file.path(directory, allfiles[i]))
        master.data.frame <- rbind(master.data.frame,thisfile)
    }

    means <- colMeans(master.data.frame[pollutant],na.rm = TRUE)
    print(means)
}
...