对于包含三列的数据框 -
$x
- http://pastebin.com/SGrRUJcA $y
- http://pastebin.com/fhn7A1rj $z
- http://pastebin.com/VmVvdHEE - 我有以下代码来生成可用于绘制堆积条形图的数据框:
counted <- data.frame(table(myDf$x),variable='x')
counted <- rbind(counted,data.frame(table(myDf$y),variable='y'))
counted <- rbind(counted,data.frame(table(myDf$z),variable='z'))
如果我尝试按其Var1
列对数据框进行排序,那么 -
counted.sort <- sort_df(counted,vars="Var1")
- 我得到一个数据框,其中列Var1
现在按以下顺序具有级别:
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
"16", "17", "18", 19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35", 36", 37", "39", "42", "46", "47", "53", "54", "38",
"40", "41", "43", "44", "45", "48", "49", "50"
结果扭曲了条形图的x轴(...,“54”,“38”,“40”,“41”,“43”,......)。
如何按升序号码正确排序counted.sort
?
NB。绘图如下:
stackedBp <- ggplot(counted,aes(x=Var1,y=Freq,fill=variable))
stackedBp <- stackedBp+geom_bar(stat='identity')+scale_x_discrete('Levels')+scale_y_continuous('Frequency')
stackedBp
答案 0 :(得分:2)
我认为这样的事情应该保持Var1正确排序:
counted.sort$Var1 <- factor(counted.sort$Var1, levels = unique(counted.sort$Var1))
如果上述问题无法解决问题,您还可以?factor
查看订购选项。
答案 1 :(得分:2)
如评论中所述,R ?factor
让您感到困惑。
让我们从table
开始吧。此命令用于将观察结果分类为不同的类别。这里隐含的是,生成的类别通常是分类而不是数字。
这就是为什么当您将表格传递给data.frame
时,表格类别会转换为因子。检查counted
:
> str(counted)
'data.frame': 138 obs. of 3 variables:
$ Var1 : Factor w/ 53 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Freq : int 126 711 1059 2079 3070 2716 2745 3329 2916 2671 ...
$ variable: Factor w/ 3 levels "x","y","z": 1 1 1 1 1 1 1 1 1 1 ...
因素的水平和标签之间存在重要区别。在内部,因子始终存储为整数代码,这些代码可能与您的标签不对应。内部代码完全是任意的,仅供记账。
安全的方法是做两次强制:
counted$Var1 <- as.numeric(as.character(counted$Var1))
然后将其显式转换回ggplot2
代码中的一个因子:
stackedBp <- ggplot(counted,aes(x=factor(Var1),y=Freq,fill=variable))
此外,您应该记住,对数据框进行排序不会改变与该数据框中的因素关联的基础顺序。要更改该行为,在直接指定级别时,实际上需要使用ordered
参数factor
。对数据框进行排序只会改变存储值的顺序,而不是如何排序级别。