首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:在尝试添加从csv文件转换的数据帧时,使用“rbind”函数出错

R:在尝试添加从csv文件转换的数据帧时,使用“rbind”函数出错
EN

Stack Overflow用户
提问于 2019-09-23 10:06:05
回答 1查看 327关注 0票数 0

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

目标编写了一个名为“污染均值”的函数,该函数通过指定的监视器列表计算污染物(硫酸盐或硝酸盐)的平均值。函数“污染”包含三个参数:“目录”、“污染物”和“id”。给定矢量监视器ID号,“污染平均”读取“目录”参数中指定的目录中的“颗粒物质数据”,并在所有监视器中返回污染物的平均值,而忽略任何编码为NA的缺失值。

脚本:

代码语言:javascript
复制
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)
}

调用函数:

代码语言:javascript
复制
pollutantmean("specdata","sulphate",1:10)

错误消息

代码语言:javascript
复制
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值。这就是代码分裂的地方。

请让我知道如何解决这个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-23 14:01:29

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

代码语言:javascript
复制
master.data.frame <- NULL

当然,r2evans是绝对正确的,重复重新绑定是完全没有效率的。但它可能足够好-你决定你的申请。

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

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

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

最后- read.csv已经返回一个data.frame -不需要转换它。

下面是一个略为清晰的版本:

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58060017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档