【问题标题】:Reordering dcast data frame重新排序 dcast 数据帧
【发布时间】:2013-03-12 19:10:20
【问题描述】:

是否可以重新排序作为 dcast() 调用的结果的数据帧的列 例如

给定数据:

> dput(copyOfRes)
structure(list(docName = c("doc2", "doc1", "doc1", "doc1", "doc1", 
"doc1", "doc1", "doc1", "doc1", "doc1", "doc1", "doc2"), day_of_week = c(11, 
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2)), .Names = c("docName", 
"week_number"), row.names = c(NA, -12L), class = "data.frame")

所以,当我按如下方式使用 dcast() 时:

library(reshape2)
dcast(copyOfRes, docName ~ week_number, length)

结果是:

  docName 2 11
1    doc1 0 10
2    doc2 1  1

我希望数据框的值减少week_number 如下:

  docName 11  2
1    doc1 10 0
2    doc2 1  1

我试过dcast(copyOfRes, docName ~ sort(week_number, decreasing= TRUE), length),但还是不行。有什么建议吗?

【问题讨论】:

  • 为什么不能在投射后重新排列列?
  • @AnandaMahto:谢谢您的回答,但您认为手动重新排序n(其中n 总是会改变)列数是一个好的解决方案?我宁愿不这样做,也不愿按照你的建议去做。
  • 没有。我宁愿让我的数据代表我实际期望的数据:有序因子。
  • @AnandaMahto:我不明白。数据来自数据库。因此,这些值将是动态的。能详细点吗?
  • 当您读入数据时,您可以确保在开始进行任何分析之前将“week_number”读入或转换为一个因子,而不是将其存储为数字。如果你想减少有序因子,像copyOfRes$week_number <- with(copyOfRes, factor(week_number, levels = sort(unique(week_number), decreasing=TRUE))) 这样的东西应该这样做。然后,当您使用其他功能时,例如summary,R 将制表而不是尝试使用mean 或该列,并且dcast 将能够做您想做的事情。

标签: r dataframe


【解决方案1】:

您可以在dcast() 中使用factor() 设置适当的级别顺序。

 dcast(copyOfRes, 
   docName ~ factor(week_number,levels=unique(week_number)), length)
      docName 11 2
    1    doc1 10 0
    2    doc2  1 1

【讨论】:

  • +1。这解决了眼前的问题,但我仍然认为 OP 应该从考虑 week_number 变量开始,如果它最终将被视为一个因素。
【解决方案2】:

您可以在此处使用reorder 和rev

dcast(copyOfRes, docName ~ reorder(week_number,rev(week_number)), length)
Using week_number as value column: use value.var to override.
  docName 11 2
1    doc1 10 0
2    doc2  1 1

【讨论】:

  • 很好地使用了reorder。永远忘记那个! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2022-08-05
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多