如何从数据框中按降序获得前 n 家公司
Posted
技术标签:
【中文标题】如何从数据框中按降序获得前 n 家公司【英文标题】:How to get top n companies from a data frame in decreasing order 【发布时间】:2012-08-29 23:27:30 【问题描述】:我正在尝试从数据框中获取前“n”家公司。下面是我的代码。
data("Forbes2000", package = "HSAUR")
sort(Forbes2000$profits,decreasing=TRUE)
现在我想从这个排序的向量中获得前 50 个观察值。
【问题讨论】:
【参考方案1】:head
和tail
是非常有用的函数!
head(sort(Forbes2000$profits,decreasing=TRUE), n = 50)
如果你想要data.frame的前50行,那么你可以使用plyr
中的arrange
函数对data.frame
进行排序,然后使用head
library(plyr)
head(arrange(Forbes2000,desc(profits)), n = 50)
请注意,我将 profits
包装在对 desc
的调用中,这意味着它将按降序排序。
不用 plyr 也能工作
head(Forbes2000[order(Forbes2000$profits, decreasing= T),], n = 50)
【讨论】:
【参考方案2】:使用order
对data.frame
进行排序,然后使用head
仅获取前50 行。
data("Forbes2000", package = "HSAUR")
head(Forbes2000[order(Forbes2000$profits, decreasing=TRUE), ], 50)
【讨论】:
【参考方案3】:您可以从dplyr
使用rank
。
library(dplyr)
top_fifty <- Forbes2000 %>%
filter(rank(desc(profits))<=50)
这会按降序对您的数据进行排序,并且仅保留排名小于或等于 50 的值(即前 50 名)。 Dplyr 非常有用。命令和链接语法非常容易理解。 10/10 会推荐。
【讨论】:
也可以使用top_n(n = 50, wt = profits)
代替filter(...)
【参考方案4】:
Mnel 是对的,一般来说,您希望使用 head() 和 tail() 函数以及排序函数。我应该提一下,对于中等数据集,Vince 的方法工作得更快。如果你没有使用 head() 或 tail(),那么你可以使用基本的 subsection 调用运算符 []....
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,]
但是,我确实推荐使用 head()、tail() 或 filter() 函数,因为常规 [] 运算符假定您的数据以易于绘制的数组或矩阵格式结构化。 (希望这能回答 Teja 的问题)
现在您选择哪种包装很大程度上是主观的。但是阅读人们的cmets,我会说选择使用plyr的arrange(),bases的order()和utils head()和tails,或者plyr()很大程度上取决于内存大小和行大小你的数据集。我可以更详细地介绍 Plyr 和有时 Dplyr 如何在处理大型复杂数据集时遇到问题,但我不想跑题。
附:这是我第一次回答,因此非常感谢您的反馈。
【讨论】:
以上是关于如何从数据框中按降序获得前 n 家公司的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android Firebase实时数据库中按降序获取孩子[重复]