重写一个函数,求一组表中列的平均值,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 的观测值专栏