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)