2013-01-17 131 views
1

我使用下面的代码中提取的完整的情况下,从文件数:返回一个数据帧

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 

但是,我希望它返回一个这样的数据帧:

enter image description here

我不知道我在做什么错。谢谢!

+0

如果你把'浏览器()'你的函数调用中,你将能够探索实时(你的)功能的内部运作。在SO上查看一些调试主题。 –

+0

这是对Coursera政策的公然违反 – EdwardGarson

回答

4

sapply在这里返回matrix。你可以得到的形状和键入要:

as.data.frame(t(complete("specdata",1:12))) 

或者把这个在complete功能,随时待命,以sapplytmatrix行转换为列,as.data.frame将它强制转换为列。

0

您的代码是确定的。为了得到您想要的效果,请使用

t(sapply(id, fun, directory)) 

而不是sapply(id, fun, directory)

你的代码应该是这样的;

complete <- function(directory, id=1:332) { 
    t(sapply(id, fn, directory))} 
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)) 

}