【问题标题】:plot() | qplot(..., geom="boxplot",...) unwanted ordering of factors (R 3.1.2)情节() | qplot(..., geom="boxplot",...) 不需要的因子排序 (R 3.1.2)
【发布时间】:2015-04-10 10:08:24
【问题描述】:

我有一个由两列组成的数据框,一列是因子列(“C7”:“C20”),另一列是数字。当我尝试绘制数据框时,因子的顺序按字母顺序排列,即从 C10...C20、C7、C8、C9 开始。我正在尝试按顺序排序,即 C7 -> C20。

我尝试使用因子函数对因子进行排序:

X2 <- factor(X1$column1, levels:c("C7", "C8", "C9", ... , "C20"))

edit: {我意识到上面的代码是不正确的。请参阅下面的评论以进行详细说明}。

但这会将整个数据框更改为因子类,并且绘图函数无法识别箱线图的因子 - 例如"错误:ggplot2 不知道如何处理类因子的数据"

有什么想法吗?

【问题讨论】:

  • 这没有意义。如果将 data.frame 的一列转换为因子,则它不应影响其余列。你确定它不是矩阵吗?在上面的代码中,您只需为变量 X2 分配一个因子。是对问题进行排序还是在绘制 data.frame?目前还不清楚。也许您需要创建一个可重现的示例,以便向我们准确展示您的需求。
  • 如果让您感到困惑,我深表歉意。我是 R 新手。问题在于将 data.frame 绘制为箱线图。数字y轴很好。然而,x 轴上的因子排序并不如所希望的那样,即 C7-C20。相反,x 轴从 C10...C20,C7,C8,C9 开始排序。数据的结构使得每个因素大约有 100 个观察值。我看到我在上面的代码中出错了...... X2 只包含因子变量,而不是数字变量。数据的类是一个data.frame。

标签: r plot ggplot2


【解决方案1】:

这是一种可能的解决方案:首先绘制没有 x 轴的数据值,然后使用正确的标签添加它

df = data.frame(fact = paste0("C",c(7:20)), num = runif(14))
plot(df$num, xaxt="n")
axis(1, at = 1:length(df$num), labels = df$fact)

然后你可以在plot中更改type =来改变绘图的类型(点、线、步等)

【讨论】:

  • 谢谢 clemlaflemme。问题:如果我用一个独立的数据框标记轴,R如何知道哪个数据观察属于哪个组?
  • 确定没有控制,我不知道@LyzandeR 提出的mixedsort。这是一个更好的解决方案
  • 感谢您考虑 clemmlaflemme。您的代码将来会很有用。谢谢。
【解决方案2】:

我想出了如何在数据框中更改变量的类,这解决了我的问题。我需要引用数据框中的变量来更改其类:

df$col1 <- factor(df$col1, levels= c("C7", "C8", "C9", "C10", ..., "C20"))

【讨论】:

  • 我用mixedsort 发布了一个替代方案,以防您有 100 个因素,例如在这种情况下,您需要很长时间才能输入这些因素。作为备选 :)。但这就是这个想法,因此是赞成票。
  • 谢谢莱赞德。是的,用所有的引号等输入 C7...C10,这很烦人。 mixedsort() 函数非常有用。谢谢!
【解决方案3】:

好的,因此您需要使用 gtools 包中的 mixedsort 才能做到这一点:

mixedsort 根据数字部分对字母数字字符串进行排序,即在这种情况下,这正是您所需要的。

示例数据

x <- factor(  rep(c('c1','c2','c10','c11'),each=10))
y <- runif(40)
df <- data.frame(y,x)

boxplot(y ~ x, data=df)

如果你绘制这些数据,你会发现我遇到了和你一样的问题:

解决方案

但如果您使用mixedsort 对级别进行排序,那么问题就解决了:

library(gtools)


df <- data.frame(y,x)
#essentially this is the only line (below) that makes the difference. It just
#orders the factor's levels in the way you want
df$x <- factor(df$x, levels=mixedsort(levels(df$x)))

boxplot(y ~ x, data=df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2011-04-28
    • 2023-03-06
    相关资源
    最近更新 更多