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)
}
数据: 可以在此处下载包含数据的驱动器文件夹: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)
}