R 基于变量中前N个最频繁值的子集数据帧

R 基于变量中前N个最频繁值的子集数据帧,r,ggplot2,count,subset,ranking,R,Ggplot2,Count,Subset,Ranking,我的目标是创建一个简单的密度或长数据帧的条形图,显示课程中民族的相对频率(MOOC)。我只是不想所有的国籍都在那里,只想排名前十。我在下面创建了这个示例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=fa

我的目标是创建一个简单的密度或长数据帧的条形图,显示课程中民族的相对频率(MOOC)。我只是不想所有的国籍都在那里,只想排名前十。我在下面创建了这个示例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()
d=data.frame(课程=sample(字母[1:5],500,替换=T),国籍=as.factor(样本(1:172500,替换=T)))

mm这里有一个方法来选择前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()
#计算频率

选项卡使用
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()
#十大国籍
d2%
计数(国籍)%>%
排名靠前的(10)%>%
安排(n,国籍)%>%
变异(国籍=因素(国籍,级别=唯一(国籍)))
d%>%
筛选器(国籍%(在%d2$National中)%%>%
突变(国籍=因素(国籍,级别=级别(d2$国籍))%>%
ggplot(aes(x=国籍,填充=课程))+
geom_bar()

非常感谢。就在今天下午,我正在查看
dplyr
,但意识到我没有时间深入研究它。这个答案对我来说更“容易理解”,但你如何对ggplot结果排序?关于你的“PS”和“编辑”:通常更容易首先使用你选择的数据按摩工具准备数据框,然后调用
ggplot
,这与你的情况类似,是众多例子中的一个。干杯