首页 文章

如何按其中一行的子集平均值对数据帧进行排序?

提问于
浏览
3

我对R很新,但我取得了很好的进展 . 我已经能够将ggplot2弯曲到我的意愿,除了一件事:在我的箱线图中沿着x轴绘制分类标签的顺序 . 我认为这只是我对如何处理公式中数据帧范围的了解,但这里是假数据,作为一个名为df的数据帧:

Index    Label    Value
index1   A        1
index2   A        2
index3   A        3
index4   B        12
index5   B        11
index6   B        10
index7   C        8
index8   C        7
index9   C        9
...
index76  Z        15
index77  Z        17
index78  Z        16

我的情节代码看起来像 qplot(df$Label, df$Value, data=df) + scale_x_discrete("Label") + opts(axis.text.x = theme_text(angle = 90, hjust = 0, size=7)) + geom_boxplot() 并且给了我我想要的东西,这是一个箱形图,显示标签A的一个盒子和胡须,一个用于B,一个用于C.但是,轴按照标签的顺序排列(盒子图1,2,3最接近原点,10,11,12位于中间,7,8,9位于图的右侧) . 我想要的是箱线图数据从标签平均值最高的子集开始,然后按递减顺序进行 . 我可以在每个标签内平均 mean(df$Label[1:3])mean(df$Label[4:6]) 等,但我无法弄清楚如何让图表显示,使标签的图形不按它们在 factor(df$Label) 中出现的顺序(即A,B,C)沿着x,带有方框2,1,18),但按照标签内最高的平均值到最低值(即沿着x的B,C,An,然后是11,8,2的方框) .

我想我会创建一个由每个标签内平均值组成的向量,并以某种方式将其传递给ggplot来指定轴顺序,但我无法弄清楚如何创建矢量来开始 .

我需要知道的是:

从最高到最低的顺序,获得由每个标签的平均值组成的向量的最佳方法是什么?

如何将该向量传递给 ggplot ,以便它按这些值对x轴进行排序,同时仍然使用 factor(df$Label) 标记 x

我也对其他显示数据的方法持开放态度,但我认为我非常接近我想要的东西,并且给定标签内的值的均值和传播很重要 .

2 回答

  • 0

    这是一种方法

    # create a dummy data frame
    set.seed(1234)
    df = data.frame(
           label = rep(letters[1:3], each = 3),
           value = sample(100, 9))
    
    # boxplot without sorting
    qplot(label, value, data = df, geom = 'boxplot')
    

    enter image description here

    # boxplot with label sorted by median of value
    qplot(reorder(label, value, median), value, data = df, geom = 'boxplot')
    

    enter image description here

  • 5

    Label 是一个因素 . 尝试 as.numeric(df$Label) 查看每个级别的因子对应的数字 . ggplot2很可能以数字级别顺序使用标签 . 您可以通过将 levels 参数传递给 factor 来订购因子的级别 . 例如,如果您按照所需的顺序在矢量中包含每个标签, ordered.levels=c("B","C","A",...) ,那么您可以通过转换为caracter并返回标签"reorder",并使用明确的 levels 参数: df$Label <- factor(as.character(df$Label), levels=ordered.levels) .

    所有这些都假定ggplot2使用水平的数值来对图进行排序 .

相关问题