data :包含数据的驱动器文件夹可以在这里下载:光谱数据。该文件夹包含332个逗号分隔值(CSV)文件,其中包含美国332个地点的细颗粒物(PM)空气污染污染监测数据。每个文件包含来自单个监视器的数据,每个监视器的ID编号包含在文件名中。例如,监视器200的数据包含在文件“200.csv”中。每个文件包含三个变量。日期:以(年月日)格式表示的观测日期,硫酸盐:该日空气中的硫酸盐PM水平(以每立方米微克为单位);硝酸盐:该日空气中的硝酸盐PM水平(以微克/立方米计)。
目标编写了一个名为“污染均值”的函数,该函数通过指定的监视器列表计算污染物(硫酸盐或硝酸盐)的平均值。函数“污染”包含三个参数:“目录”、“污染物”和“id”。给定矢量监视器ID号,“污染平均”读取“目录”参数中指定的目录中的“颗粒物质数据”,并在所有监视器中返回污染物的平均值,而忽略任何编码为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文件的所有读数的主数据框架,然后使用colMeans函数对列进行过滤,并且不需要NA值。这就是代码分裂的地方。
请让我知道如何解决这个错误。
发布于 2019-09-23 14:01:29
问题是,您的初始数据框架不具有与从文件中读取的列名相同的列名。您可以用正确的名称构造它,但是让它成为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)
}https://stackoverflow.com/questions/58060017
复制相似问题