R代码调试和纠错理解

时间:2016-10-20 07:47:17

标签: r function debugging error-handling

我有这个代码用于计数,用于读取一个充满文件的目录,并报告每个数据文件中完全观察到的案例的数量。该函数应返回一个数据框,其中第一列是文件的名称,第二列是完整案例的数量。我需要帮助解决此代码中的错误:

  

[.data.frame(data,i)中的错误:选择了未定义的列
  另外:警告信息:
  1:在comp [i]< - !is.na(data [i])中:     要更换的物品数量不是更换长度的倍数
  2:在comp [i]< - !is.na(data [i])中:     要更换的物品数量不是更换长度的倍数
  3:在comp [i]< - !is.na(data [i])中:     要替换的项目数量不是替换长度的倍数

代码如下:

complete<-function(directory, id=1:332){
        files.list<-list.files(directory, full.names=TRUE, pattern=".csv") 
        comp<-character()
        return.data<-data.frame()
        nobs<-numeric()

        for(i in id){
         data<-read.csv(files.list[i])
            comp[i]<-!is.na(data[i])
            nobs[i]<-nrow(comp[i])

    }
        return.data<-c(id,nobs)
    }

2 个答案:

答案 0 :(得分:2)

您的问题是,!is.na()返回布尔向量而不是单个值,您不能将多个元素插入单个元素comp[i]

R中,有一个函数complete.cases,它完全符合您的尝试。这样你的功能就像这样

complete<-function(directory, id=1:332){
  files.list<-list.files(directory, full.names=TRUE, pattern=".csv") 
  nobs <- numeric(length(id))
  for(i in id){
    data<-read.csv(files.list[i])
    nobs[i]<-sum(complete.cases(data))
  }
  return.data<-data.frame(id,nobs)
}

除了你的代码有一些我想指出的缺陷

  • 为什么comp类型为character
  • 如果事先知道(nobs <- numeric(length(id))
  • ,则分配矢量的大小
  • 您是否真的只想检查i加载的data.frame`中的i列是否缺少值?
  • 如果您分配return.data <- c(id,nobs) return.data将是一个数字向量,其开头为ids,末尾为nobs

答案 1 :(得分:0)

你需要为你的数据提供一个索引..所以它选择所有行和i column.e.g comp [i]&lt; - !is.na(data [,i])