【问题标题】:Error in file(file, "rt") : invalid 'description' argument in complete.cases program文件错误(文件,“rt”):complete.cases 程序中的“描述”参数无效
【发布时间】:2013-01-20 01:50:34
【问题描述】:

我正在编写一个 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)

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    id 这里是一个向量,所以 path 变成了一个字符串向量,当你调用 read.csv 时,你会同时传递所有路径而不是一个。尝试将上面的行更改为

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

    看看是否可行。

    【讨论】:

    • 感谢乔纳森快速及时的回复。它解决了错误。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢 Nathan 帮助我解决问题并让我了解我犯错的地方。
    【解决方案3】:

    您可以尝试使用sapply,而不是使用for 来读取数据。例如

    mydata &lt;- sapply(path, read.csv)

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

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

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

    【讨论】:

      【解决方案4】:

      我正在解决确切的问题.. 目录“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])
      }
      

      【讨论】:

        【解决方案5】:

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

        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"  
        

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

        【讨论】:

          【解决方案6】:

          我遇到了这个问题,因为我试图对数据框而不是向量运行 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) {
          

          【讨论】:

            【解决方案7】:

            将对象 id 更改为 i - 因为您在迭代对象 i 的 for 循环中 即 path

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-11
              • 2012-06-02
              • 1970-01-01
              • 2011-09-08
              相关资源
              最近更新 更多