重写一个函数,求一组表中列的平均值,returns 一些结果与旧程序一致,一些略有不同
Rewriting a function, to find mean of column in set of tables, returns some results consistent with old program and some slightly different
我目前正在编写一个程序(完全公开,这是“家庭作业”)。该程序旨在 运行 通过一系列基于给定范围的文件,将它们整理成一个大 table 无 NA 并找到所提供污染物的平均值(这是 table).
我以前写过这个程序,但想尝试更多地划分函数,所以我重写了它。
奇怪的是,某些范围 return 与原始程序中的数字完全相同,而其他 return(相对)完全不同的结果。
例如:
pollutantmean("specdata", "sulfate", 1:10)
Old Program: 4.064128
New Program: 4.064128
pollutantmean("specdata", "nitrate", 23)
Old Program: 1.280833
New Program: 1.280833
pollutantmean("specdata", "nitrate", 70:72)
Old Program: 1.706047
New Program: 1.732979
在最后一个例子中,旧程序产生了预期的结果,而新程序产生的结果根本不在可接受的table误差范围内。
我只是不知所措,我一直在尝试重写我的新代码,以尽量减少与旧代码的差异,而不是简单地复制旧程序,现在的代码将在下面(与原来的程序)。但是没有任何效果,尽管进行了很多更改,但我仍然收到完全相同(不好)的结果。
新计划:
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))
}
不同之处在于 complete.cases()
returns TRUE
在其中一列为 NA 的每一行上,而 na.rm
arg inside mean
func 将删除所选列(向量)为 NA 的行。
示例:
x <- airquality[1:10, -1]
x[3,3] <- NA
> mean(x[complete.cases(x), "Temp"]) == mean(x[["Temp"]], na.rm = T)
[1] FALSE
请注意第 5、6 行 complete.cases()
returns TRUE
,其中 Solar.R
列为 NA,因此您在 Temp
中丢失了 2 个非 NA 的观测值专栏
我目前正在编写一个程序(完全公开,这是“家庭作业”)。该程序旨在 运行 通过一系列基于给定范围的文件,将它们整理成一个大 table 无 NA 并找到所提供污染物的平均值(这是 table).
我以前写过这个程序,但想尝试更多地划分函数,所以我重写了它。
奇怪的是,某些范围 return 与原始程序中的数字完全相同,而其他 return(相对)完全不同的结果。
例如:
pollutantmean("specdata", "sulfate", 1:10)
Old Program: 4.064128
New Program: 4.064128
pollutantmean("specdata", "nitrate", 23)
Old Program: 1.280833
New Program: 1.280833
pollutantmean("specdata", "nitrate", 70:72)
Old Program: 1.706047
New Program: 1.732979
在最后一个例子中,旧程序产生了预期的结果,而新程序产生的结果根本不在可接受的table误差范围内。
我只是不知所措,我一直在尝试重写我的新代码,以尽量减少与旧代码的差异,而不是简单地复制旧程序,现在的代码将在下面(与原来的程序)。但是没有任何效果,尽管进行了很多更改,但我仍然收到完全相同(不好)的结果。
新计划:
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))
}
不同之处在于 complete.cases()
returns TRUE
在其中一列为 NA 的每一行上,而 na.rm
arg inside mean
func 将删除所选列(向量)为 NA 的行。
示例:
x <- airquality[1:10, -1]
x[3,3] <- NA
> mean(x[complete.cases(x), "Temp"]) == mean(x[["Temp"]], na.rm = T)
[1] FALSE
请注意第 5、6 行 complete.cases()
returns TRUE
,其中 Solar.R
列为 NA,因此您在 Temp
中丢失了 2 个非 NA 的观测值专栏