Dataframe列显示错误排序

时间:2012-02-18 00:04:33

标签: r

对于包含三列的数据框 -

- 我有以下代码来生成可用于绘制堆积条形图的数据框:

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

2 个答案:

答案 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。对数据框进行排序只会改变存储值的顺序,而不是如何排序级别。