我在下面的地址做第二部分的作业:
问: zip文件包含332个逗号分隔值(CSV)文件,其中包含美国332个地点的细颗粒物(PM)空气污染监测数据。每个文件包含来自单个监视器的数据,每个监视器的ID号包含在文件名中。例如,监视器200的数据包含在文件"200.csv“中。每个文件包含三个变量:
日期:以YYYY-MM-DD格式表示的观测日期(年-月-日)硫酸盐:该日期空气中硫酸盐PM的水平(以微克/立方米衡量)硝酸盐:该日期空气中硝酸盐PM的水平(以微克/立方米衡量)对于此编程任务,您将需要解压缩此文件并创建目录'specdata‘。解压zip文件后,不要对“specdata”目录中的文件进行任何修改。在每个文件中,您会注意到有许多天缺少硫酸盐或硝酸盐(或两者都缺少)(编码为NA)。这在美国的空气污染监测数据中很常见。
第2部分
编写一个函数,读取一个满是文件的目录,并报告每个数据文件中完全观察到的案例的数量。该函数应返回一个数据框,其中第一列是文件名,第二列是完整案例的数量。
我的代码如下:
complete <- function(directory="d:/dev/r/documents/specdata", id) {
df <- data.frame(no=integer(), nobs=integer())
for (i in id) {
sum=0
myfilename = paste(directory,"/",formatC(i, width=3, flag="0"),".csv",
sep="")
masterfile = read.table(myfilename, header=TRUE, sep=",")
for (j in 1:nrow(masterfile)){
if (!is.na(masterfile[j, 2]) && !is.na(masterfile[j, 3])){
sum = sum + 1
}
}
df[i,]<-c(i, sum)
}
df
}注意,我把所有的001.csv,002.csv,...在目录d:/dev/r/document/specdata中,这就是为什么我在参数中使用此字符串作为默认值的原因。您可以看到我使用嵌套的for循环来实现这一点,并且我意识到我应该能够用lapply替换至少一个for循环。但是我正在努力解决这个问题,因为我非常熟悉C++,所以我真的不知道如何实现lapply。我在Stackoverflow上读了一些代码,我能理解其中的大部分,但当涉及到编写我自己的代码时,我无法让它工作。
提前感谢!在此期间,我会再试一次。
发布于 2016-10-15 03:00:49
您可以首先将内部循环替换为如下所示:
rows_to_sum <- !is.na(masterfile[, 2]) & !is.na(masterfile[, 3])
df[i,] <- sum(masterfile[rows_to_sum, 1])发布于 2016-10-15 03:01:19
这个作业通过多次使用短语"complete cases“给你一个提示。您应该查看R函数complete.cases()。它将取代对内部for循环的需求。
对于每个文件,运行complete.cases(文件)。计算返回的向量中的TRUE元素的数量。输出文件名和上面的计数。
https://stackoverflow.com/questions/40050164
复制相似问题