Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何根据其中一行的子集的平均值对数据帧进行排序?_R_Sorting_Ggplot2_Boxplot - Fatal编程技术网

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

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

我对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_离散(“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')