36

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

如,

id nobs
1  108
2  345
...
etc

这是我写的函数:

complete <- function(directory, id = 1:332) {

  for(i in 1:332) {
    path<-paste(directory,"/",id,".csv",sep="")
    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))
    i<-i+1
  }

  completedata<-c(id,nobs)
}

我执行功能:

complete("specdata",id=1:332)

但我收到此错误:

Error in file(file, "rt") : invalid 'description' argument

我还尝试了traceback()调试代码的函数,它给出了以下输出:

traceback()
# 4: file(file, "rt") at #6
# 3: read.table(file = file, header = header, sep = sep, quote = quote, 
#    dec = dec, fill = fill, comment.char = comment.char, ...) at #6
# 2: read.csv(path) at #6
# 1: complete("specdata", id = 1:332)
4

7 回答 7

47

没有一个完全可重现的例子很难说,但我怀疑你的问题是这一行:

path<-paste(directory,"/",id,".csv",sep="")

id这是一个向量,因此 path 成为字符串的向量,当您调用时,read.csv您会一次传递所有路径,而不仅仅是一个。尝试将上面的行更改为

path<-paste(directory,"/",id[i],".csv",sep="")

看看这是否有效。

于 2013-01-20T01:57:17.377 回答
8

您的文件路径似乎有问题。您将完整的向量 id =c(1:332) 传递给文件路径名。如果您的文件名为 1.csv、2.csv、3.csv 等。
您可以更改此行:

path<-paste(directory,"/",id,".csv",sep="")

path<-paste(directory,"/",i,".csv",sep="")

并省略或修改函数的 id 输入。

于 2013-01-20T02:12:05.607 回答
8

除了使用 afor来读取数据,您可以尝试sapply. 例如

mydata <- sapply(path, read.csv).

由于path是一个向量,sapply将迭代该向量并应用于read.csv它。因此,将不需要for循环,并且您的代码将更加简洁。

从那里您将获得matrix每个文件及其各自的信息,您可以从中提取观察结果。

要查找观察结果,您可以执行mydata[2,1][[1]]. 请记住,行将是您的因素,而您的列将是您的文件。

于 2014-12-06T22:56:17.827 回答
2

我正在解决确切的问题..目录“specdata”中的文件名以 001.csv 和 002.csv.... 099.csv 一直命名为文件 332.csv 但是,当您回忆 id= 1 然后您的文件名变为目录中不存在的 1.csv 。尝试使用此函数获取每个 id 文件的路径。

filepaths <- function (id){
    allfiles = list.files(getwd())
    file.path(getwd(), allfiles[id])
}
于 2016-04-03T18:17:25.513 回答
1

我在这句话中遇到了同样的问题:

Browse[2]> read.csv(list.files(".", "XCMS-annotated-diffreport--.*csv$"), row.names = 1)
Error in file(file, "rt") : invalid 'description' argument

然后,我发现在同一路径中有两个不同的 csv 文件,如下所示:

Browse[2]> list.files(".", "XCMS-annotated-diffreport--.*csv$")
[1] "XCMS-annotated-diffreport--1-vs-2-Y.csv" "XCMS-annotated-diffreport--1-vs-2.csv"  

当我删除一个文件时,它又可以工作了。

于 2016-08-22T07:44:18.177 回答
0

我遇到了这个问题,因为我试图对数据框而不是向量运行 for 循环:

  ids <- th[th$nobs > threshold,]
  for(i in ids) {

这就是变量“ids”的样子:

     id nobs
2     2 1041
154 154 1095
248 248 1005

本来应该:

  ids <- th[th$nobs > threshold,]
  for(i in ids$id) {
于 2016-07-04T02:57:46.067 回答
0

将对象 id 更改为 i - 因为您在 for 循环中使用迭代对象 i ie path<-paste(directory,"/",id,".csv",sep="") 到 ie path<-paste(directory," /",i,".csv",sep="")

于 2020-03-20T21:08:54.353 回答