2012-08-29 42 views
8

我想從數據框中獲得頂級'n'公司。以下是我的代碼。如何從數據框中降序排名前n位公司

data("Forbes2000", package = "HSAUR") 
sort(Forbes2000$profits,decreasing=TRUE) 

現在我想從這個排序的向量中得到前50個觀測值。

回答

19

headtail是非常有用的功能!

head(sort(Forbes2000$profits,decreasing=TRUE), n = 50) 

如果你想第50行的data.frame的,那麼你可以使用arrange功能從plyrdata.frame排序,然後使用head

library(plyr) 

head(arrange(Forbes2000,desc(profits)), n = 50) 

請注意,我在包裹profits請致電desc,這意味着它將按降序排列。

爲了不plyr

head(Forbes2000[order(Forbes2000$profits, decreasing= T),], n = 50) 
+0

上帝我愛plyr。 – bstockton

7

使用order工作的data.frame排序,然後使用head只拿到第50行。

data("Forbes2000", package = "HSAUR") 
head(Forbes2000[order(Forbes2000$profits, decreasing=TRUE), ], 50) 
2

您可以從dplyr使用rank

library(dplyr) 
    top_fifty <- Forbes2000 %>% 
     filter(rank(desc(profits))<=50) 

這樣按降序排列數據,只保留排名小於或等於50的值(即排名前50)。
Dplyr非常有用。命令和鏈接語法很容易理解。 10/10會推薦。

+0

也可以使用'top_n(n = 50,wt = profit)'而不是'filter(...)' – andrasz

0

Mnel是正確的,一般情況下,您想要使用head()和tail()函數以及排序函數。對於中等數據集,我應該提到Vince的方法工作得更快。如果您沒有使用頭()或尾部(),那麼你可以使用的基本款電話運營商[] ....

library(plyr) 
x = arrange(Forbes2000,desc(profits)) 
x = x[1:50,] 
#Or using Order 
x = Forbes2000[order(Forbes2000$profits, decreasing= T),] 
x = x[1:50,] 

不過,我真的建議頭(),尾巴() ,或filter()函數,因爲常規[]運算符假定您的數據是以易於繪製的數組或矩陣格式構造的。 (希望,這回答了泰雅的問題)

現在你選擇哪個pacakage主要是主觀的。然而,閱讀人們的評論,我會說使用plyr的arrange(),{bases}的order()與{utils} head()和tail或者plyr()的選擇很大程度上取決於內存大小和行大小你的數據集。我可以詳細瞭解Plyr和Dplyr如何在大型複雜數據集中遇到問題,但我不想脫離主題。

P.S.這是我第一次回答這樣的反饋意見。