R:尝试添加从 csv 文件转换的数据帧时 'rbind' 函数出错

R: Error with the 'rbind' function while trying to add data frames converted from csv files

数据: 可以在此处下载包含数据的驱动器文件夹:specdata。该文件夹包含 332 个逗号分隔值 (CSV) 文件,其中包含美国 332 个地点的细颗粒物 (PM) 空气污染的污染监测数据。每个文件都包含来自单个监视器的数据,每个监视器的 ID 号包含在文件名中。例如,监视器 200 的数据包含在文件“200.csv”中。每个文件包含三个变量。日期:以(年-月-日)格式表示的观测日期,硫酸盐:该日期空气中硫酸盐 PM 的水平(以微克每立方米为单位),硝酸盐:空气中硝酸盐 PM 的水平在那一天(以每立方米微克为单位)

Objective 编写一个名为“pollutantmean”的函数,计算指定监测器列表中污染物(硫酸盐或硝酸盐)的平均值。函数“pollutantmean”接受三个参数:“directory”、“pollutant”和“id”。给定矢量监视器 ID 号,“pollutantmean”从“directory”参数中指定的目录中读取监视器的颗粒物数据和 returns 所有监视器中污染物的平均值,忽略编码为的任何缺失值不适用

脚本:

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 文件的所有读数,然后使用 colMeans 函数过滤它的列且没有 NA 值。这就是代码崩溃的地方。

请告诉我如何解决该错误。

问题是您的初始数据框没有与从您的文件中读取的列名相同的列名。您可以使用正确的名称构造它,但让它成为 NULL 并像这样初始化要容易得多:

master.data.frame <- NULL

当然 r2evans 是完全正确的,重复的 rbinding 根本没有效率。但它可能已经足够好了——你决定你的申请。

还有一些不请自来的评论:

我会避免使用 setwd 而是使用 file.path 构造正确的数据路径并在 read.csv.

中使用它

我也会尽量避免通过数字索引来寻址 data.frame 的列,而是使用列名。

终于 - read.csv 已经 returns 一个 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)
}