2014-05-08 26 views
0

我必須做出一個函數,它接受一個目錄的路徑的任務,看很多的.csv文件,並返回一個data.frame與完整的病例數爲形式的每個文件:通過因素對數據框中的行進行計數,保持順序?

## id nobs 
## 1 2 1041 
## 2 4 474 
## 3 8 192 
## 4 10 148 
## 5 12 96 

我有以下解決方案(函數簽名中給出):

complete <- function(directory, id = 1:332) { 
    myFiles <- list.files(path=directory,pattern=".csv",recursive=T,full.names=T) 
    data <- lapply(myFiles[id],read.csv) 
    frame <- do.call("rbind",data) 
    frame <- frame[complete.cases(frame),] 
    frame$ID <- factor(frame$ID, ordered=T) 
    by <- by(frame,frame$ID,nrow,simplify=F) 
    complete <- data.frame(id=names(by),nobs=unlist(by)) 

    return(complete) 
} 

這給了我正確的輸出,除了一個situtation。如果函數調用類似於complete(directory, 30:25),則預計會保留data.frame列id的順序(此處爲30,29等)。但是由於by按輸入因素對輸出列表進行排序,因此失敗。是否有更好的解決方案(使用標準軟件包)?或者我可以禁止排序?

回答

1

我不認爲ordered=參數正在做你認爲它是什麼。當您設置ordered=T時,它會創建一個有序因子,它類似於有序變量,因爲規則因子的行爲更像是一個分類變量。它不會假定矢量已經排序,也不會以任何方式影響矢量的排序。

如果要指定一個給定的順序,必須使用

frame$ID <- factor(frame$ID, levels=unique(frame$ID)) 

然後by應該像預期的那樣。

+0

感謝您的回答。是的,我對'odered'參數的功能有一個錯誤的想法。當我使用'frame $ ID < - factor(frame $ ID,levels = unique(frame $ ID))'我使它正常工作時,但現在還有另一個問題。對於像c(2,4,8,10,12)這樣的輸入,生成的data.frame在其row.names字段中具有id值。現在有2,4,8,10,12(我必須滿足單元測試),而不是1,2,3,4,5。其他部分(id,nobs)現在是正確的。 –

+0

@Meiner好吧,你正在設置ID爲'data.frame(id = names(by),nobs = unlist(by))''而不是使用'names(by)'只需要'id = 1:length通過)'或類似的東西。 – MrFlick

+0

「id」字段正確。我指的是打印data.frame(不帶列名)時最左邊列中的數字。我必須設置'row.names = NULL',然後按預期工作。在改變之前,我不必做這樣的事情。 –

相關問題