R 如何根据其中一行的子集的平均值对数据帧进行排序?
我对R相当陌生,但我正在取得良好的进步。我已经能够按照我的意愿弯曲ggplot2,除了一件事:分类标签在箱线图中沿x轴绘制的顺序。我认为这只是我在公式中如何处理数据帧范围的知识中的一个漏洞,但以下是伪数据,称为df的数据帧:R 如何根据其中一行的子集的平均值对数据帧进行排序?,r,sorting,ggplot2,boxplot,R,Sorting,Ggplot2,Boxplot,我对R相当陌生,但我正在取得良好的进步。我已经能够按照我的意愿弯曲ggplot2,除了一件事:分类标签在箱线图中沿x轴绘制的顺序。我认为这只是我在公式中如何处理数据帧范围的知识中的一个漏洞,但以下是伪数据,称为df的数据帧: Index Label Value index1 A 1 index2 A 2 index3 A 3 index4 B 12 index5 B 11 index6 B
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_离散(“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])
等方法对每个标签进行平均,但我不知道如何使图形显示,以使标签的曲线图不会按照它们在因子(df$label)
中出现的顺序进行(即A、B、C沿x方向,方框在2、11、8处)但从标签内的最高平均值到最低平均值的顺序(即B、C、A沿x和框,然后在11、8、2)
我想我会创建一个向量,由每个标签内的平均值组成,并以某种方式将其传递给ggplot以指定轴顺序,但我不知道如何创建向量
我需要知道的是:
获得由每个标签的平均值组成的向量的最佳方法是什么,从最高到最低的顺序是什么
如何将该向量传递给ggplot
,以便它根据这些值对x轴进行排序,同时仍使用因子(df$Label)标记x
轴
我也愿意接受关于显示数据的其他方式的建议,但我认为我非常接近我想要的&给定标签中值的平均值和分布很重要。
标签
是一个因素。尝试as.numeric(df$Label)
查看每一级因子对应的数字。ggplot2很可能以数字级别顺序使用标签。通过将levels
参数传递给factor
,可以对因子的级别进行排序。例如,如果向量中的每个标签都按照您想要的顺序排列,ordered.levels=c(“B”、“c”、“a”…)
,那么您可以通过转换为字符并返回来“重新排列”标签,并使用显式的levels
参数:df$Label,这是一种方法
# 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')
我应该澄清,Value中的值无论如何都不是唯一的——有很多重叠。好吧,看看这个。事实证明,R有一个简单的函数来完成我在回答中描述的恼人的手动过程。relevel()
是您的软件库中另一个方便的函数。谢谢,我不得不说,我在这个网站上的第一次体验真的很好。使用Ramnath的答案吧。事实证明,有一个reorder
函数或多或少实现了我所描述的功能。
# boxplot with label sorted by median of value
qplot(reorder(label, value, median), value, data = df, geom = 'boxplot')