我对R来说是全新的,并且在在线R课程中遇到了一些问题。我有一个包含332个csv文件的文件夹,名为001-332。任务是编写一个函数,给出给定范围内每个文件的完整案例数和每个文件的id(即函数(目录,id),其中directory是包含文件的文件夹,id是a矢量指定要使用的文件)。输出应如下所示:https://d396qusza40orc.cloudfront.net/rprog%2Fdoc%2Fcomplete-demo.html
我设法创建了一个数据框,其中包含id参数指定的文件中的所有数据。
complete <- function(directory, id=1:332){
files <- list.files(directory, full.names=T)
dat <- data.frame()
for(i in id){
dat<-rbind(dat, read.csv(files[i]))
}
}
在此之后,我尝试在sum(complete.cases(dat))
上对dat数据集(当然在我的函数内部)中使用complete.cases函数,但这清楚地给出了整个&#34; dat&#的完整案例的总和。 34;数据帧。我的问题是,我应该分别得到每个id的完整案例总和。我现在使用许多子集解决方案进行了数小时的实验,但无法找到实现此目的的方法。任何帮助或建议将不胜感激!
答案 0 :(得分:0)
在工作目录中创建几个文件后,
list.files(pattern="^file\\d+")
#[1] "file1.txt" "file2.txt"
sapply(files, function(x) {x1 <- read.csv(x, header=TRUE, sep="")
sum(complete.cases(x1))})
# file1.txt file2.txt
# 1 4
您也可以更改功能
complete <- function(directory, id=1:2, pat='^file\\d+'){
files <- list.files(directory, pattern=pat, full.names=TRUE)
v1 <- vector("numeric", length(files))
for(i in seq_along(id)){
v1[i] <- sum(complete.cases(read.csv(files[i], sep='')))
}
data.frame(id=id, nobs=v1)
}
complete(directory, id=1:2)
# id nobs
#1 1 1
#2 2 4
您还可以使该功能根据id
complete <- function(directory, id=1:2){
fileLook <- paste0("file", sprintf('%03d', id))
Allfiles <- list.files(directory, full.names=TRUE)
files <- grep(paste(fileLook, collapse="|"), Allfiles, value=TRUE)
library(gtools)
files <- mixedsort(files)
v1 <- vector("numeric", length(files))
for(i in seq_along(id)){
v1[i] <- sum(complete.cases(read.csv(files[i], sep='')))
}
data.frame(id=id, nobs=v1)
}
complete(directory, 1:2)
# id nobs
#1 1 1
#2 2 4
complete(directory, c(1,3))
# id nobs
#1 1 1
#2 3 6