首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改R程序以减少for循环的使用?

如何修改R程序以减少for循环的使用?
EN

Stack Overflow用户
提问于 2016-10-15 02:50:13
回答 2查看 167关注 0票数 0

我在下面的地址做第二部分的作业:

https://www.coursera.org/learn/r-programming/supplement/amLgW/programming-assignment-1-instructions-air-pollution

问: zip文件包含332个逗号分隔值(CSV)文件,其中包含美国332个地点的细颗粒物(PM)空气污染监测数据。每个文件包含来自单个监视器的数据,每个监视器的ID号包含在文件名中。例如,监视器200的数据包含在文件"200.csv“中。每个文件包含三个变量:

日期:以YYYY-MM-DD格式表示的观测日期(年-月-日)硫酸盐:该日期空气中硫酸盐PM的水平(以微克/立方米衡量)硝酸盐:该日期空气中硝酸盐PM的水平(以微克/立方米衡量)对于此编程任务,您将需要解压缩此文件并创建目录'specdata‘。解压zip文件后,不要对“specdata”目录中的文件进行任何修改。在每个文件中,您会注意到有许多天缺少硫酸盐或硝酸盐(或两者都缺少)(编码为NA)。这在美国的空气污染监测数据中很常见。

第2部分

编写一个函数,读取一个满是文件的目录,并报告每个数据文件中完全观察到的案例的数量。该函数应返回一个数据框,其中第一列是文件名,第二列是完整案例的数量。

我的代码如下:

代码语言:javascript
复制
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上读了一些代码,我能理解其中的大部分,但当涉及到编写我自己的代码时,我无法让它工作。

提前感谢!在此期间,我会再试一次。

EN

回答 2

Stack Overflow用户

发布于 2016-10-15 03:00:49

您可以首先将内部循环替换为如下所示:

代码语言:javascript
复制
rows_to_sum <- !is.na(masterfile[, 2]) & !is.na(masterfile[, 3])
df[i,] <- sum(masterfile[rows_to_sum, 1])
票数 1
EN

Stack Overflow用户

发布于 2016-10-15 03:01:19

这个作业通过多次使用短语"complete cases“给你一个提示。您应该查看R函数complete.cases()。它将取代对内部for循环的需求。

对于每个文件,运行complete.cases(文件)。计算返回的向量中的TRUE元素的数量。输出文件名和上面的计数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40050164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档