我的任务是创建一个函数,该函数获取目录的路径,读取大量.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
按因子排序输出列表。是否有更好的解决方案来解决我的问题(使用标准包)?或者我可以禁止排序吗?
答案 0 :(得分:1)
我不认为ordered=
参数正在按照您的想法行事。设置ordered=T
时,它会创建一个与序数变量类似的有序因子,其中常规因子的行为更像分类变量。它不假设向量已经被排序,也不会以任何方式影响向量的排序。
如果要指定给定订单,则必须使用
frame$ID <- factor(frame$ID, levels=unique(frame$ID))
然后by
应按预期行事。