用0替换数据帧中的NA,案例仍未显示在输出R中

时间:2014-05-20 22:27:57

标签: r replace na

这是我正在使用的CSV文件的目录: https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip

这是我的代码:

complete<- function(directory, id=1:332){
    data<-NULL
    for (i in 1:length(id)) {
            data[[i]]<- c(paste(directory, "/",formatC(id[i], width=3, flag=0),".csv",sep=""))     
    }
    cases<-NULL
    for (d in 1:length(data)) { 
            cases[[d]]<-c(read.csv(data[d]))
    }
    df<-NULL
    for (c in 1:length(cases)){
            df[[c]]<-(data.frame(cases[c]))
    }
    dt<-do.call(rbind, df)
    ok<-(complete.cases(dt))

    finally<-as.data.frame(table(dt[ok, "ID"]))
    colnames(finally)<-c('id', 'nobs')
    replace(finally,is.na(finally),0)
    return(finally)

}

当我进入时: complete('specdata') 我得到一个数据框,其中包含每个csv文件中的完整案例数,但完全省略了没有完整案例的CSV文件。我需要带有0个完整案例的csv文件显示在数据框中,nobs值为0.我尝试在代码中使用replace但它似乎根本不会改变我的数据框。

1 个答案:

答案 0 :(得分:1)

给定数据框dfcomplete.cases(df)返回true或false值的向量。您可以使用此向量作为df的索引来提取具有完整案例的子集,如下所示:

df[complete.cases(df),]

在文本中写入的完整个案数或nobs值是此结果较小的数据框中的行数。您可以使用nrow函数来计算:

nrow(df[complete.cases(df),])

对于没有完整案例的数据框,这将返回0。

要解决此练习,您需要构建一个包含两个向量的数据框:idnobs,其中nobs是由数据框指示的完整案例数。相应的id。要从nobs获取id值,引入辅助函数是有意义的:

get.nobs <- function(id) {
  df <- getmonitor(id, directory)
  nrow(df[complete.cases(df),])
}

getmonitor是一个从csv文件中读取数据帧的函数。获得此id的数据框后,您可以返回其中完整案例的行数。

您可以使用此功能获取每个ID的计数。而不是循环,这是sapply的完美用例。

全部放在一起(剧透警告!):

  

 complete <- function(directory, id = 1:332) {
   get.nobs <- function(id) {
     df <- getmonitor(id, directory)
     nrow(df[complete.cases(df),])
   }
   data.frame(id, nobs=sapply(id, get.nobs))
 }