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

Thi*_*nis 4 r subset ggplot2

我的目标是创建一个长数据框的简单密度或条形图,显示课程中国籍的相对频率(MOOC).我只是不想要那里的所有国籍,只有前10名.我创建了这个例子df下面+我用于绘图的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()
Run Code Online (Sandbox Code Playgroud)

......但是如上所述:我想要基于频率的整个数据集的子集.以上显示了所有数据.

PS.我为上下文添加了ggplot2代码,但也因为ggplot2本身可能有一些东西可以使这成为可能(我怀疑它).

编辑2014-12-11: 当前的答案使用ddplyr或表方法来达到所需的子集,但我想知道是否有更直接的方法来实现相同的...我会让它留下来,看看是否有是其他方式.

Hen*_*rik 5

使用dplyr功能counttop_n获得前十名的国籍.由于top_n关系的原因,本例中包含的国籍数量因关系而超过10.arrange计数,使用factorlevels按降序设置国籍.

# 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sve*_*ein 3

以下是选择前 10 个国籍的方法。请注意,多个国籍共享相同的频率。因此,选择前 10 名会导致忽略一些具有相同频率的国籍。

# calculate frequencies
tab <- table(d$nationality)
# sort
tab_s <- sort(tab)
# extract 10 most frequent nationalities
top10 <- tail(names(tab_s), 10)
# subset of data frame
d_s <- subset(d, nationality %in% top10)
# order factor levels
d_s$nationality <- factor(d_s$nationality, levels = rev(top10))

# plot
ggplot(d_s, aes(x = nationality, fill = as.factor(course))) +
  geom_bar() + 
  theme_classic()
Run Code Online (Sandbox Code Playgroud)

请注意,我更改colourfill因为colour会影响边框的颜色。

在此输入图像描述