2013-03-12 78 views
2

是否有可能對dcast()調用結果爲 E.x的數據幀進行重新排序。重新排序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),但它仍然不起作用。有什麼建議麼?

+0

爲什麼你就不能重新排序鑄造後您的列? – A5C1D2H2I1M1N2O1R2T1 2013-03-12 19:18:36

+1

@AnandaMahto:謝謝你的回答,但你認爲重新排序'n'(其中n總是會改變)手動列數可以作爲一個好的解決方案嗎?我寧願不這樣做,而不是做你的建議。 – 2013-03-12 19:24:25

+0

沒有。我寧願讓我的數據代表我實際期望的數據:有序的因素。 – A5C1D2H2I1M1N2O1R2T1 2013-03-12 19:32:27

回答

3

你可以在這裏使用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

很好的使用'reorder'。總是忘掉那個! +1 – A5C1D2H2I1M1N2O1R2T1 2013-03-12 19:43:32

6

您可以使用factor()裏面的dcast()設置適當的級別順序。

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

+1。這解決了眼前的問題,但我仍然認爲OP應該從「week_number」變量開始,如果它最終會被視爲一個因素。 – A5C1D2H2I1M1N2O1R2T1 2013-03-12 19:42:54