我的目标是创建一个长数据框的简单密度或条形图,显示课程中国籍的相对频率(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或表方法来达到所需的子集,但我想知道是否有更直接的方法来实现相同的...我会让它留下来,看看是否有是其他方式.
使用dplyr功能count并top_n获得前十名的国籍.由于top_n关系的原因,本例中包含的国籍数量因关系而超过10.arrange计数,使用factor和levels按降序设置国籍.
# 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)

以下是选择前 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)
请注意,我更改colour为fill因为colour会影响边框的颜色。
