Coursera课程-r语言-程序作业1

题目介绍:

r语言课程的第一个程序作业。将要编写3个函数。实验数据为“美国大气污染”的数据,可以从Coursera上下载,下载后的文件为zip文件。需要自行解压缩并添加到你的作业项目中。

数据介绍:

zip文件可以从这里下载:
specdata.zip [2.4MB]
这个zip文件中包含了332个csv文件。csv文件中记录着检测大气质量的数据,记录着美国332个地区的“细微颗粒值(PM值)”。每个csv文件中代表着一个监测地区的记录。例如:地区200的大气数据,记录在文件“200.csv”中。每个文件包含三个变量:
-Date:date的数据以“YYYY-MM-DD”的方式存储
-sulfate:空气中硫化物颗粒水平
-nitrate:空气中硝化物颗粒水平
本作业中,你需要解压缩这个zip文件,并保存在目录名为“specdata”的文件夹下。你可以打开csv文件观察数据,你会发现里面包含着很多空值,这在空气质量监控的数据集中非常常见。

Part1

第一部分功能介绍:

编写一个函数“pollutantmean”能够计算指定文件列表中所有大气数据的污染物(sulfate或者nitrate)的均值。这个函数有三个属性,分别是’directory’、’pollutant’和’id’。’directory’代表文件目录,’pollutant’代表污染物的名称,’id’代表文件序列,是一个数值向量。注意,在数据处理中,你需要去掉空值。

第一部分程序实现:
pollutantmean <- function(directory, pollutant, id = 1:332) {
  filenames<-dir(directory, full.names=T)
  n<-length(id)
  m<-rep(0,n)
  ct<-rep(0,n)
  for(i in id){
    data<-read.csv(filenames[i],header=TRUE)
    ct[match(i,id)]<-sum(!is.na(data[pollutant]))
    m[match(i,id)]<-mean(as.matrix(data[pollutant]),na.rm=TRUE)
  }
  result<-(m[ct>0] %*% ct[ct>0])[1,1]/sum(ct[ct>0])
  result
  }
第一部分程序运行结果:
> source("pollutantmean.R")
> pollutantmean("specdata", "sulfate", 1:10)
[1] 4.064128
> pollutantmean("specdata", "nitrate", 70:72)
[1] 1.706047
> pollutantmean("specdata", "nitrate", 23)
[1] 1.280833

Part2

第二部分功能介绍:

编写一个函数“complete”读取文件目录下的所有文件,计算每个csv文件中完整的记录数(每条记录都不包含空值)。函数需要返回一个dataframe,第一列为文件id,第二列为记录数nobs。

第二部分程序实现:
complete <- function(directory, id = 1:332) {
  files_list <- dir(directory, full.names=T)[id]
  data_list<-lapply(files_list,read.csv)
  nobs<-sapply(lapply(data_list,complete.cases),sum)
  result<-as.data.frame(cbind(id,nobs))
  result
}
第二部分程序运行结果:
> source("complete.R")
> complete("specdata", 1)
  id nobs
1  1  117
> complete("specdata", c(2, 4, 8, 10, 12))
  id nobs
1  2 1041
2  4  474
3  8  192
4 10  148
5 12   96
> complete("specdata", 30:25)
  id nobs
1 30  932
2 29  711
3 28  475
4 27  338
5 26  586
6 25  463
> complete("specdata", 3)
  id nobs
1  3  243

Part3

第三部分功能介绍:

编写一个函数“corr”,读取指定文件目录下的文件,当csv文件中完整的记录数超过预设的阀值时,计算该文件中sulfate和nitrate的相关系数。这个函数最后需要返回一个相关系数向量。

第三部分程序实现:
corr <- function(directory, threshold = 0) {
  source("complete.R")
  IN<-complete(directory,id = 1:332)
  id<-as.vector(IN[IN$nobs>threshold,"id"])
  result<-c()
  for(i in id){
    files_list <- dir(directory, full.names=T)[i]
    data<-read.csv(files_list,header=TRUE)
    dataNoNA<-na.omit(data)
    corrresult<-cor(dataNoNA$sulfate,dataNoNA$nitrate)
    result<-c(result,corrresult)
  }
  result
}
第三部分程序运行结果:
> source("corr.R")
> source("complete.R")
> cr <- corr("specdata", 150)
> head(cr)
[1] -0.01895754 -0.14051254 -0.04389737 -0.06815956 -0.12350667
[6] -0.07588814
> summary(cr)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.21060 -0.04999  0.09463  0.12530  0.26840  0.76310 
> cr <- corr("specdata", 400)
> head(cr)
[1] -0.01895754 -0.04389737 -0.06815956 -0.07588814  0.76312884
[6] -0.15782860
> summary(cr)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.17620 -0.03109  0.10020  0.13970  0.26850  0.76310 
> cr <- corr("specdata", 5000)
> summary(cr)
Length  Class   Mode 
     0   NULL   NULL 
> length(cr)
[1] 0
> cr <- corr("specdata")
> summary(cr)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-1.00000 -0.05282  0.10720  0.13680  0.27830  1.00000 
> length(cr)
[1] 323

完成这个作业还是花了蛮多时间的,但是最终完成还是很有成就感的。fighting!!!

转载请注明作者“MieAn100”及其出处
CSDN博客(http://blog.csdn.net/MieAn100)