我的目标是创建一个长数据框的简单密度或条形图,显示课程(MOOC)中国籍的相对频率。我只是不希望所有的国籍都在那里,只是前10名。我创建了下面的示例df+我用于绘图的ggplot 2代码。
d=data.frame(course=sample(LETTERS[1:5], 500,replace=T),nationality=as.factor(sample(1:172,500,replace=T)))
mm <- ggplot(d, aes(x=nationality, colour=factor(course)))
mm + geom_bar() + theme_classic()
......但正如所说:我想要一个基于频率的整个数据集的子集。上面显示了所有数据。
PS.我添加ggplot 2代码是为了上下文,但也是因为ggplot 2本身可能有一些东西使这成为可能(不过我对此表示怀疑)。
**EDIT 2014-12-11:**目前的答案都是用ddplyr或者table的方法来达到想要的子集,但是我想知道是不是有更直接的方法来达到同样的效果。。我就先让它先留着吧,看看有没有其他的方法。
3条答案
按热度按时间u59ebvdq1#
使用
dplyr
函数count
和top_n
获取前10个国籍。由于top_n
考虑了平局,因此本例中包含的国籍数由于平局而超过10个。arrange
计数,使用factor
和levels
按降序设置国籍。ccrfmcuu2#
下面是选择前10个国家的方法。请注意,多个国家共享相同的频率。因此,选择前10个国家会导致忽略一些具有相同频率的国家。
请注意,我将
colour
更改为fill
,因为colour
会影响边框的颜色。n3h0vuf23#
虽然这些问题在一段时间前已经提出,但为了完整起见,我提出另外两个解决方案:
1.一个使用forcats包中的
fct_lump_n()
,另一个使用filter()
fct_lump_n()
汇总了除10个最常见的国籍之外的所有国籍,并将其归入“其他”类别。请注意,在fct_lump_n()
参数中,需要使用ties.method = "first"
才能真正获取前10个国籍,而不是11或12个。所有其他国籍都标记为“其他”,即使它们可能与前10个国籍一样频繁出现。国籍级别仅按字母顺序排列。
1.另一个解决方案是使用forcats包中的
fct_infreq()
、cur_group_id()
和filter()
。cur_group_id()
为每个国籍分配一个组ID。为了从最常用的国籍开始,我们首先需要按频率对列nationality
进行排序。然后,我们过滤前10个组ID,也就是最常用的10个国籍。国籍级别首先按
n
排序,然后按字母顺序排序。我使用
count()
来验证两个 Dataframed1
和d2
看起来是一样的。两种解决方案都有优点,即我们不需要第二个(临时) Dataframe 或临时向量。我希望这对以后的人有帮助。