【问题标题】:Count rows in a data frame by factors, preserve order?按因子计算数据框中的行数,保持顺序?
【发布时间】: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 正在按因子对输出列表进行排序。我的问题有更好的解决方案(使用标准包)吗?或者我可以禁止排序吗?

【问题讨论】:

    标签: r dataframe r-factor


    【解决方案1】:

    我不认为ordered= 参数正在做你认为的那样。当您设置ordered=T 时,它会创建一个有序因子,它类似于一个有序变量,其中一个常规因子的行为更像一个分类变量。它不假定向量已经排序,也不会以任何方式影响向量的排序。

    如果你想指定一个给定的顺序,你必须使用

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

    然后by 应该按预期运行。

    【讨论】:

    • 感谢您的回答。是的,我对odered 参数的功能有一个错误的想法。当我使用frame$ID &lt;- factor(frame$ID,levels=unique(frame$ID))时,它可以正常工作,但现在又出现了另一个问题。使用c(2, 4, 8, 10, 12) 之类的输入,生成的 data.frame 在其 row.names 字段中具有 id 值。现在不是 1,2,3,4,5,而是 2,4,8,10,12(我必须完成一个单元测试)。其他部分(id、nobs)现在是正确的。
    • @Meiner 好吧,您正在使用data.frame(id=names(by),nobs=unlist(by)) 设置ID,所以不要使用names(by),只需执行id=1:length(by) 或类似的操作。
    • id 字段正确。我的意思是当您打印 data.frame (没有列名)时最左列中的数字。我必须设置row.names=NULL,然后它按预期工作。在改变之前,我不必做这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2013-10-03
    • 2013-07-10
    相关资源
    最近更新 更多