0

我目前正在编写一个程序(完全公开,这是“家庭作业”)。该程序旨在根据给定的范围运行一系列文件,将它们整理到一个没有 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))
}
4

1 回答 1

0

The difference is that complete.cases() returns TRUE on each row where one of the columns is NA, while na.rm arg inside mean func will remove rows where the selected column (vector) is NA.

Example:

x <- airquality[1:10, -1]
x[3,3] <- NA

> mean(x[complete.cases(x), "Temp"]) == mean(x[["Temp"]], na.rm = T)
[1] FALSE

Note that complete.cases() returns TRUE on rows 5, 6 where Solar.R column is NA, so you lose 2 observations not NA in Temp column

于 2015-07-22T07:15:14.057 回答