重新排列dcast数据框

8

是否可以重新排列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),但仍然无法正常工作。有什么建议吗?


为什么你不能在转换后重新排列你的列? - A5C1D2H2I1M1N2O1R2T1
1
@AnandaMahto:感谢您的回答,但是您认为手动重新排列“n”(其中n将始终更改)列符合良好解决方案的要求吗?我宁愿不这样做,而不是按照您的建议去做。 - name_masked
不。我宁愿让我的数据代表我实际期望的内容:有序因子。 - A5C1D2H2I1M1N2O1R2T1
1
@AnandaMahto:我不明白。数据来自数据库,因此值将是动态的。您能详细说明一下吗? - name_masked
当您读取数据时,可以确保在开始任何分析之前将“week_number”读入或转换为因子,而不是将其存储为数字。如果您想要降序排序的因子,可以使用类似于copyOfRes$week_number <- with(copyOfRes, factor(week_number, levels = sort(unique(week_number), decreasing=TRUE)))的语句。然后,当您使用其他函数(如summary)时,R会制表而不是尝试获取该列的平均值,而dcast将能够实现您想要的功能。 - A5C1D2H2I1M1N2O1R2T1
顺便提一下,以这种方式预处理数据在做其他事情时也会很有帮助,例如绘图。请参阅另一个SO用户的博客文章,其中提出了类似的建议。 - A5C1D2H2I1M1N2O1R2T1
2个回答

14
你可以在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
+1。这解决了眼前的问题,但我仍然认为如果week_number最终要被视为因子,那么OP应该从因子分解开始。 - A5C1D2H2I1M1N2O1R2T1

6
您可以在此处使用reorderrev
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

1
很好地使用了“重新排序”。我总是忘记它!+1 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接