2012-08-29 16 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.这是我第一次回答这样的反馈意见。