我正在学习如何编写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的新手,因为我确信非常明显。
答案 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
都存在。您必须在rbind
和for
每次迭代return
时// ... Rest of Aurelia Class
configureRouter(config, router){
this.router = router;
config.routes([
{ route: 'route1',
...}
{ route: 'route2',
...}
]);
// ... more router config code
}
// ... rest of class