我目前正在编写一个程序(完全公开,这是“家庭作业”)。该程序旨在根据给定的范围运行一系列文件,将它们整理到一个没有 NA 的大表中,并找到所提供污染物的平均值(这是表中的一列)。
我之前写过这个程序,但想尝试更多地划分功能,所以我重写了它。
奇怪的是,有些范围返回的结果与原始程序中的完全相同,而另一些则返回(相对)完全不同的结果。
例如:
污染物平均值(“规格数据”,“硫酸盐”,1:10)
旧程序:4.064128
新程序:4.064128
污染物平均值(“规格数据”,“硝酸盐”,23)
旧程序:1.280833
新程序:1.280833
污染物平均值(“规格数据”,“硝酸盐”,70:72)
旧程序:1.706047
新程序:1.732979
在最后一个示例中,旧程序产生了预期的结果,而新程序产生的结果根本不在可接受的误差范围内。
我简直不知所措,我一直在尝试重写我的新代码,以尽量减少与旧冷的差异,而不是简单地复制旧程序,而当前代码将在下面(与原始程序一起)。但是没有任何效果,尽管进行了很多更改,但我仍然收到完全相同的(坏)结果。
新程序:
concatTables <- function(directory, id, hasHeader = TRUE, keepNAs = FALSE) {
totalTable <- NULL
currentTable <- NULL
for (file in id) {
filename <- paste( sep ="",
directory,"/",formatC(file,width=3,format="d",flag="0"),".csv"
);
currentTable <- read.csv(file = filename, header = hasHeader);
if (!is.null(totalTable)) {
totalTable <- rbind(totalTable, currentTable);
}
else {
totalTable <- currentTable;
}
}
if (!keepNAs) {
totalTable <- completeRows(totalTable);
}
totalTable
}
completeRows <- function(table) {
table <- table[complete.cases(table),]
table
}
pollutantmean <- function(directory = paste(getwd(),"/specdata",sep = ""), pollutant, id = 1:332, hasHeader = TRUE, keepNAs = FALSE) {
table <- NULL
table <- concatTables(directory,id,hasHeader,keepNAs);
tableMean <- mean(table[[pollutant]]);
tableMean
}
旧程序
(这会产生更好的结果)
dataFileName <- NULL
pollutantmean <- function(directory = "specdata", pollutant, id = 1:332, idWidth = 3, fullLoop = TRUE) {
dataFrame <- NULL
dataFrameTotal <- NULL
for (i in id) {
dataFileName <- paste(directory, "/", formatC(i, width = idWidth, flag = 0), ".csv", sep = "")
if (!is.null(dataFileName)) {
dataFileConnection <- file(dataFileName)
dataFrame <- read.csv(dataFileConnection, header = TRUE)
dataFrameTotal <- rbind(dataFrame, dataFrameTotal)
##close(dataFileConnection)
if (fullLoop == FALSE) {
break
}
}
else print("DATAFILENAME IS NULL!")
}
print(mean(dataFrameTotal[[pollutant]], na.rm = TRUE))
}