【问题标题】:Subset data frame based on top N most frequent values in variable基于变量中前 N 个最频繁值的子集数据框
【发布时间】:2014-12-11 11:51:26
【问题描述】:

我的目标是创建一个长数据框的简单密度或条形图,显示课程 (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()

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

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

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

【问题讨论】:

  • 关于您的“PS”和“编辑”:首先使用您选择的数据按摩工具准备数据框通常要容易得多,然后 i> 致电ggplotThis Q&A 与您的情况类似,是众多示例之一。干杯。

标签: r ggplot2 count subset ranking


【解决方案1】:

使用dplyr 函数counttop_n 获得前10 名国籍。因为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()

【讨论】:

  • 非常感谢。就在今天下午,我正在研究dplyr,但意识到我没有时间深入研究它。看起来像 q 不错的语法,稍后会研究它。
【解决方案2】:

这是一种选择前 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()

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

【讨论】:

  • 这个答案对我来说更“容易理解”,但你会如何订购 ggplot 结果?
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 2018-11-26
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多