我使用以下代码从文件中提取完整案例的数量:
complete <- function(directory, id=1:332) {
sapply(id, fn, directory)}
fn <- function(id, directory) {
zero <- sprintf("%03d", id)
name <- paste(directory,"/",zero,".csv",sep="")
frame <- read.csv(name)
ok <- complete.cases(frame)
return(c("nobs"=sum(ok),"id"=id)) }
然后,例如:
complete("specdata",1:12)
此代码返回:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
nobs 117 1041 243 474 402 228 442 192 275 148 443 96
id 1 2 3 4 5 6 7 8 9 10 11 12
但是,我希望它返回一个类型的数据框:
我不确定我做错了什么。谢谢!
答案 0 :(得分:4)
sapply
在这里返回matrix
。您可以获得所需的形状和类型:
as.data.frame(t(complete("specdata",1:12)))
或者将其放在complete
函数中,围绕sapply
的调用。 t
将matrix
行转换为列,as.data.frame
将其强制转换为列。
答案 1 :(得分:0)
您的代码没问题。为了获得您想要的结果,请使用
t(sapply(id, fun, directory))
而不是sapply(id, fun, directory)
。
您的代码应如下所示;
complete <- function(directory, id=1:332) {
t(sapply(id, fn, directory))}
答案 2 :(得分:0)
complete <- function(directory, id = 1:332) {
as.data.frame(t(sapply(id, fn, directory)))
}
fn <- function(id, directory){
if(is.numeric(id)){
id=id
}else{
id = as.numeric(id)
}
fileName <- paste(paste(directory,'/',sep=''),paste(id,'.csv',sep=''),sep='')
data <- read.csv(fileName )
tows <- (complete.cases(data))
rowsNum <- nrow(data[tows,])
return(c("id"=as.numeric(id),"nobs"=rowsNum))
}