如何基于前N个频繁出现的变量来对长数据帧进行子集化

我的目标是创建一个长数据框的简单密度或条形图,显示课程中国籍的相对频率(MOOC).我只是不想要那里的所有国籍,只有前10名.我在我用于绘图的ggplot2代码下创建了这个例子.

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.我为上下文添加了ggplot2代码,但也因为ggplot2本身可能有一些东西可以使这成为可能(我怀疑它).

编辑2014-12-11:
当前的答案使用ddplyr或table方法来获得所需的子集,但是我想知道是否有更直接的方法来实现相同的目标..我会暂时保留它,看看是否还有其他方法.

使用dplyr函数count和top_n来获得前10名的国籍.因为top_n占关系,所以本例中包含的国籍数量因关系而超过10.安排计数,使用因子和水平按降序设置国籍.

# top-10 nationalities
d2 <- d %>%
  count(nationality) %>%
  top_n(10) %>%
  arrange(n, nationality) %>%
  mutate(nationality = factor(nationality, levels = unique(nationality)))

d %>%
  filter(nationality %in% d2$nationality) %>%
  mutate(nationality = factor(nationality, levels = levels(d2$nationality))) %>%
  ggplot(aes(x = nationality, fill = course)) +
    geom_bar()
相关文章
相关标签/搜索