仅限循环显示最后记录

时间:2016-08-18 17:00:05

标签: r

我正在学习如何编写R函数来读取一个充满文件的目录,并报告每个数据文件中完全观察到的案例的数量。

我的功能适用于一种情况,但在多种情况下,循环只显示最后一条记录。

complete <- function(directory, id = 1:332) {
    files_list <- list.files(path = directory, full.names = TRUE)
    dat <- data.frame()
    for (i in id) {
            dat <- rbind(dat, read.csv(files_list[i]))
            }
    nobs <- sum(complete.cases(dat))
    id <- i
    data.frame(id, nobs)
}

运行时的预期结果

    > complete("specdata", 1:6)

    ##   id nobs
    ## 1 1   932
    ## 2 2   711
    ## 3 3   475
    ## 4 4   338
    ## 5 5   586
    ## 6 6   463

当id = 1:6时,它返回一个带有十个结果的data.frame,它返回:

    > complete("Specdata", 1:6)


   id nobs
 1 6  3562

我怀疑问题是该函数每次循环时都会替换值。我已经搜索了SO和其他地方寻求帮助&#34;只显示了最后的记录&#34;问题,无法从其他答案中找出解决方案。

提前感谢您的帮助。我是R的新手,因为我确信非常明显。

2 个答案:

答案 0 :(得分:0)

是的,您的代码中有很多内容尚不清楚。具体来说,rbind根据您的描述没有意义,也不会在您的函数中将id作为参数。做你所描述的更惯用的方法就是这样,其中sapply循环遍历文件列表,匿名函数读取它并返回完整案例的数量。

files_list <- list.files(path = directory, full.names = TRUE)
sapply(files_list, function(fi) sum(complete.cases(read.csv(fi))))

答案 1 :(得分:0)

希望这应该有用!

complete <- function(directory, id = 1:332) {
        files_list <- list.files(path = directory, full.names = TRUE)
        dat <- data.frame()
        tmp <- data.frame()
                for (i in id) {
                        dat <- rbind(dat, read.csv(files_list[i]))
                        nobs <- sum(complete.cases(dat))
                        id <- i
                        tmp <- rbind(tmp,data.frame(id,nobs))
                }


        tmp
}

详细说明:

这主要是因为您在for循环后返回数据框,因此设置了i的最新值并且所有sum都存在。您必须在rbindfor每次迭代return// ... Rest of Aurelia Class configureRouter(config, router){ this.router = router; config.routes([ { route: 'route1', ...} { route: 'route2', ...} ]); // ... more router config code } // ... rest of class