按因子计算数据框中的行,保留顺序?

时间:2014-05-08 19:42:39

标签: r dataframe r-factor

我的任务是创建一个函数,该函数获取目录的路径,读取大量.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按因子排序输出列表。是否有更好的解决方案来解决我的问题(使用标准包)?或者我可以禁止排序吗?

1 个答案:

答案 0 :(得分:1)

我不认为ordered=参数正在按照您的想法行事。设置ordered=T时,它会创建一个与序数变量类似的有序因子,其中常规因子的行为更像分类变量。它不假设向量已经被排序,也不会以任何方式影响向量的排序。

如果要指定给定订单,则必须使用

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

然后by应按预期行事。