2013-01-20 35 views
19

我正在寫一個R函數,它讀取一個完整的文件目錄,並報告每個數據文件中完全觀察到的個案數。該函數返回一個數據框,其中第一列是文件的名稱,第二列是完整案例的數目。文件(文件,「rt」)中的錯誤:complete.cases程序中的無效'description'參數

如,

id nobs 
1 108 
2 345 
... 
etc 

這裏是我寫的函數:

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

    for(i in 1:332) { 
    path<-paste(directory,"/",id,".csv",sep="") 
    mydata<-read.csv(path) 
    #nobs<-nrow(na.omit(mydata)) 
    nobs<-sum(complete.cases(mydata)) 
    i<-i+1 
    } 

    completedata<-c(id,nobs) 
} 

我執行的功能:

complete("specdata",id=1:332) 

,但我得到這個錯誤:

Error in file(file, "rt") : invalid 'description' argument 

我也試過traceback()功能調試我的代碼,它給出了這樣的輸出:

traceback() 
# 4: file(file, "rt") at #6 
# 3: read.table(file = file, header = header, sep = sep, quote = quote, 
# dec = dec, fill = fill, comment.char = comment.char, ...) at #6 
# 2: read.csv(path) at #6 
# 1: complete("specdata", id = 1:332) 

回答

26

很難說沒有一個完全可重複的例子,但我懷疑你的問題是這一行:

path<-paste(directory,"/",id,".csv",sep="") 

id這裏是一個向量,所以路徑變成了字符串的向量,當你打電話給read.csv時,你將所有的路徑同時傳遞給它,而不是一個。嘗試將上面的行更改爲

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

並查看是否有效。

+1

感謝喬納森的快速和及時的答覆。它解決了錯誤。 –

5

看來你的文件路徑有問題。 您正在將完整矢量id = c(1:332)傳遞給文件路徑名稱。 如果你的文件被命名爲1.csv,2.csv,3.csv等。
你可以改變這一行:

path<-paste(directory,"/",id,".csv",sep="") 

path<-paste(directory,"/",i,".csv",sep="") 

,並留下了或返工你的函數的id輸入。

+0

感謝Nathan幫助我解決問題,並讓我明白我犯的錯誤。 –

2

除了使用for來讀取數據,您可以嘗試sapply。例如

mydata <- sapply(path, read.csv) .

由於path是矢量,sapply將迭代矢量,並應用read.csv到它。因此,將不需要0​​循環,並且您的代碼將更加乾淨。

從那裏你將有一個matrix其中你的每個文件和他們各自的信息,你可以從中提取觀察。

要找到觀察結果,你可以做mydata[2,1][[1]]。請記住,行將是你的因素,你的列將成爲你的文件。

1

我正在研究確切的問題..目錄「specdata」中的文件名以001.csv和002.csv .... 099.csv作爲文件名332.csv 命名,但是當您調用id = 1時,文件名將變爲1。目錄中不存在的csv。 嘗試使用此函數來獲取每個id文件的路徑。

filepaths <- function (id){ 
    allfiles = list.files(getwd()) 
    file.path(getwd(), allfiles[id]) 
} 
0

我有這個問題,因爲我是想針對該數據幀循環運行,而不是一個向量:

ids <- th[th$nobs > threshold,] 
    for(i in ids) { 

這是變量「IDS」的模樣:

 id nobs 
2  2 1041 
154 154 1095 
248 248 1005 

應該是:

ids <- th[th$nobs > threshold,] 
    for(i in ids$id) { 
0

我在這句話遇到了同樣的問題:

Browse[2]> read.csv(list.files(".", "XCMS-annotated-diffreport--.*csv$"), row.names = 1) 
Error in file(file, "rt") : invalid 'description' argument 

然後,我發現有在同一路徑下的兩個不同的CSV文件,像這樣:

Browse[2]> list.files(".", "XCMS-annotated-diffreport--.*csv$") 
[1] "XCMS-annotated-diffreport--1-vs-2-Y.csv" "XCMS-annotated-diffreport--1-vs-2.csv" 

當我刪除了一個文件,它再次工作。

相關問題