返回数据框

时间:2013-01-17 14:52:12

标签: r dataframe sapply

我使用以下代码从文件中提取完整案例的数量:

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

我不确定我做错了什么。谢谢!

3 个答案:

答案 0 :(得分:4)

sapply在这里返回matrix。您可以获得所需的形状和类型:

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

或者将其放在complete函数中,围绕sapply的调用。 tmatrix行转换为列,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))

}