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
按輸入因素對輸出列表進行排序,因此失敗。是否有更好的解決方案(使用標準軟件包)?或者我可以禁止排序?
感謝您的回答。是的,我對'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)現在是正確的。 –
@Meiner好吧,你正在設置ID爲'data.frame(id = names(by),nobs = unlist(by))''而不是使用'names(by)'只需要'id = 1:length通過)'或類似的東西。 – MrFlick
「id」字段正確。我指的是打印data.frame(不帶列名)時最左邊列中的數字。我必須設置'row.names = NULL',然後按預期工作。在改變之前,我不必做這樣的事情。 –