这是我正在使用的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但它似乎根本不会改变我的数据框。
答案 0 :(得分:1)
给定数据框df
,complete.cases(df)
返回true或false值的向量。您可以使用此向量作为df
的索引来提取具有完整案例的子集,如下所示:
df[complete.cases(df),]
在文本中写入的完整个案数或nobs
值是此结果较小的数据框中的行数。您可以使用nrow
函数来计算:
nrow(df[complete.cases(df),])
对于没有完整案例的数据框,这将返回0。
要解决此练习,您需要构建一个包含两个向量的数据框:id
和nobs
,其中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)) }