【发布时间】:2014-05-08 19:42:39
【问题描述】:
我的任务是创建一个函数,该函数采用目录路径,读取大量 .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)
}
这给了我正确的输出,除了一种情况。如果函数调用类似于complete(directory, 30:25),则预计会保留data.frame 列id 的顺序(此处为30,29 等)。但这失败了,因为by 正在按因子对输出列表进行排序。我的问题有更好的解决方案(使用标准包)吗?或者我可以禁止排序吗?
【问题讨论】: