2013-01-21 39 views
0

我有一個名爲「specdata」,包含csv文件(如001.csv,002.csv,...,332.csv)的目錄。現在我想讓我的函數讀取此目錄中的所有文件,並返回一個data.frame,其中第一列是文件的名稱,第二列是完整個案的數目。動態創建data.frame與變量在for循環

例如:

id nobs 
1 108 
2 345 
... 
etc 

現在,我寫了這個功能,它讀取「specdata」目錄下的所有文件,並生成每個文件的完整情況的總和。但我不知道如何把每個不。通過「NOBS」從循環生成到這種格式的新data.frame:

id nobs 
1 108 
2 345 
... 
... 
332 16 

我的功能:

complete <- function(directory, id = 1:332) { 

for(i in 1:332) 
    { 
    if(i<10) 
     { 

     path<-paste(directory,"/00",id[i],".csv",sep="") 
     } 
    if(i>9 & i<100) 
     { 

     path<-paste(directory,"/0",id[i],".csv",sep="") 
     } 
    if(i>99 & i<333) 
     { 

     path<-paste(directory,"/",id[i],".csv",sep="") 
     } 

    mydata<-read.csv(path) 
    #nobs<-nrow(na.omit(mydata)) 
    nobs<-sum(complete.cases(mydata)) 

    } 


} 

的問題是,「NOBS」動態獲取創建一行接一行在for循環中,我想將所有文件的「nobs」整個列表放入data.frame中。我嘗試了很多方法,但無法將整個「nobs」列表與「id」數字一起放入data.frame中。

有人可以請建議一種方法來按要求的順序返回data.frame嗎?

+1

這個功課?它看起來像彭在Coursera的「數據分析」課程中的作業任務。 –

+0

@DWin哈!你是對的。我知道這很熟悉。我昨天幫助了一名同事。 –

+0

@DWin是的。但我被困在某些東西上,因此只是想知道如何獲取data.frame動態填充的變量。所以問道。我認爲這個問題和答案也會對其他R用戶有所幫助。作業的截止日期也已過,所以我沒有用它來獲得成績。 –

回答

0

建立所有nobs值的列表最簡單的方法是這樣的:

complete <- function(directory, id = 1:332) { 
    # Create an empty vector outside the for loop 
    nobs_vector <- c() 
    for(i in 1:332) 
    { 
    if(i<10) 
    { 
     path<-paste(directory,"/00",id[i],".csv",sep="") 
    } 
    if(i>9 & i<100) 
    { 
     path<-paste(directory,"/0",id[i],".csv",sep="") 
    } 
    if(i>99 & i<333) 
    { 
     path<-paste(directory,"/",id[i],".csv",sep="") 
    } 

    mydata<-read.csv(path) 
    #nobs<-nrow(na.omit(mydata)) 
    nobs<-sum(complete.cases(mydata)) 
    # Add the value to the end of the vector 
    nobs_vector <- c(nobs_vector, nobs) 
    } 
    # Take a look at the final vector you end up with 
    print(nobs_vector) 
} 

這並不一定是優雅和高效,但它確實讓你在之後仍然存在形式的值for循環完成。如果你想以類似的方式建立一個數據幀,看看?rbind