【问题标题】:Ordering data frame with duplicate elements [duplicate]排序具有重复元素的数据框[重复]
【发布时间】:2020-11-07 20:00:52
【问题描述】:

我正在尝试绘制 2 个职业及其收入概率的叠加图:

> data.frame(income = rep(c("$10 to $20", "$20 to $30", "$30 to $40"), 2), profession=c("A", "A", "A", "B", "B", "B"), prob=c(10, 50, 40, 20, 50, 30))
      income profession prob
1 $10 to $20          A   10
2 $20 to $30          A   50
3 $30 to $40          A   40
4 $10 to $20          B   20
5 $20 to $30          B   50
6 $30 to $40          B   30

不幸的是,当收入开始具有像“100”这样的值时,这不起作用,因为它按字母顺序排序,所以我们得到一个像 (10, 100, 20, 30) 这样的 x 轴.

当我有一个职业时,我可以使用df$income <- factor(df$income, levels = df$income),但这在此处不起作用:

> df$income <- factor(df$income, levels = df$income)
Error in `levels<-`(`*tmp*`, value = as.character(levels)) : 
  factor level [4] is duplicated

有什么办法吗?

这就是我试图绘制的方式:

ggplot(df, aes(x=income, y=prob, fill=profession)) + geom_bar(stat='identity', position='identity', alpha=0.5)

【问题讨论】:

  • 如果您没有太多的收入等级,您可以使用蛮力并在编写因子函数时明确指定它们,例如级别 = I1、I2、I3。由于您的条目是字符串,因此明确定义它们不应更改您的计算。

标签: r ggplot2


【解决方案1】:

您可以在此处使用gtools::mixedsort 直接根据其值分配因子水平。

df$income <- factor(df$income, levels = unique(gtools::mixedsort(df$income)))

然后你可以像往常一样绘制它。

library(ggplot2)
ggplot(df, aes(x=income, y=prob, fill=profession)) + 
  geom_bar(stat='identity', position='identity', alpha=0.5)

【讨论】:

    【解决方案2】:

    您需要像这样明确指定值的顺序。

    df$income <- factor(df$income, 
                        levels = c("$10 to $20", "$20 to $30", "$30 to $40", "$100"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多