重新排序因子给出不同的结果,具体取决于装入的软件包 [英] Reordering factor gives different results, depending on which packages are loaded
问题描述
我想创建一个条形图,其中条形图是按高度而不是按字母顺序按类别排序的.当我加载的唯一软件包是ggplot2时,此方法运行良好.但是,当我再加载几个软件包并运行与创建,排序和绘制数据框相同的代码时,条形图又恢复为按字母顺序进行排序.
I wanted to create a barplot in which the bars were ordered by height rather than alphabetically by category. This worked fine when the only package I loaded was ggplot2. However, when I loaded a few more packages and ran the same code that created, sorted, and plotted my data frame, the bars had reverted to being sorted alphabetically again.
我每次都使用str()
检查数据帧,结果发现即使我每次都运行相同的代码,数据帧的属性现在也不同.
I checked the data frame each time using str()
and it turned out that the attributes of the data frame were now different, even though I'd run the same code each time.
下面列出了我的代码和输出.谁能解释这种不同的行为?为什么加载一些看似无关的软件包(在我正在使用的功能似乎没有被新加载的软件包掩盖的意义上是无关的)却改变了运行transform()
函数的结果?
My code and output are listed below. Can anyone explain the differing behavior? Why does loading a few apparently unrelated packages (unrelated in the sense that none of the functions I'm using seem to be masked by the newly loaded packages) change the result of running the transform()
function?
案例1:仅加载ggplot2
Case 1: Just ggplot2 loaded
library(ggplot2)
group = c("C","F","D","B","A","E")
num = c(12,11,7,7,2,1)
data = data.frame(group,num)
data1 = transform(data, group=reorder(group,-num))
> str(data1)
'data.frame': 6 obs. of 2 variables:
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6
..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11
.. ..- attr(*, "dimnames")=List of 1
.. .. ..$ : chr "A" "B" "C" "D" ...
$ num : num 12 11 7 7 2 1
情况2:再加载几个软件包,然后再次运行相同的代码
Case 2: Load several more packages, then run the same code again
library(plyr)
library(xtable)
library(Hmisc)
library(gmodels)
library(reshape2)
library(vcd)
library(lattice)
group = c("C","F","D","B","A","E")
num = c(12,11,7,7,2,1)
data = data.frame(group,num)
data1 = transform(data, group=reorder(group,-num))
> str(data1)
'data.frame': 6 obs. of 2 variables:
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5
$ num : num 12 11 7 7 2 1
更新:SessionInfo()
情况1:加载ggplot2后,运行sessionInfo()
Case 1: Ran sessionInfo() after loading ggplot2
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] C/en_US.UTF-8/C/C/C/C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_0.9.1
loaded via a namespace (and not attached):
[1] MASS_7.3-18 RColorBrewer_1.0-5 colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.15.0
[7] labeling_0.1 memoise_0.1 munsell_0.3 plyr_1.7.1 proto_0.3-9.2 reshape2_1.2.1
[13] scales_0.2.1 stringr_0.6 tools_2.15.0
情况2:加载其他程序包后运行sessionInfo()
Case 2: Ran sessionInfo() after loading the additional packages
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] C/en_US.UTF-8/C/C/C/C
attached base packages:
[1] grid splines stats graphics grDevices utils datasets methods base
other attached packages:
[1] lattice_0.20-6 vcd_1.2-13 colorspace_1.1-1 MASS_7.3-18 reshape2_1.2.1 gmodels_2.15.2
[7] Hmisc_3.9-3 survival_2.36-14 xtable_1.7-0 plyr_1.7.1 ggplot2_0.9.1
loaded via a namespace (and not attached):
[1] RColorBrewer_1.0-5 cluster_1.14.2 dichromat_1.2-4 digest_0.5.2 gdata_2.8.2 gtools_2.6.2
[7] labeling_0.1 memoise_0.1 munsell_0.3 proto_0.3-9.2 scales_0.2.1 stringr_0.6
[13] tools_2.15.0
推荐答案
发生这种情况的原因是:
This happens because:
-
gmodels
导入gdata
-
gdata
为reorder.factor
创建新方法
gmodels
importsgdata
gdata
creates a new method forreorder.factor
开始一个干净的会话.然后:
Start a clean session. Then:
methods("reorder")
[1] reorder.default* reorder.dendrogram*
现在加载gdata
(或加载gmodels
,其效果相同):
Now load gdata
(or load gmodels
, which has the same effect):
library(gdata)
methods("reorder")
[1] reorder.default* reorder.dendrogram* reorder.factor
请注意,由于基本中不存在reorder.factor
,因此没有掩盖
Notice there is no masking, since reorder.factor
doesn't exist in base
重新创建问题,但是这次明确调用不同的程序包:
Recreate the problem, but this time explicitly call the different packages:
group = c("C","F","D","B","A","E")
num = c(12,11,7,7,2,1)
data = data.frame(group,num)
基本R版本(使用reorder.default
):
str(transform(data, group=stats:::reorder.default(group,-num)))
'data.frame': 6 obs. of 2 variables:
$ group: Factor w/ 6 levels "C","F","B","D",..: 1 2 4 3 5 6
..- attr(*, "scores")= num [1:6(1d)] -2 -7 -12 -7 -1 -11
.. ..- attr(*, "dimnames")=List of 1
.. .. ..$ : chr "A" "B" "C" "D" ...
$ num : num 12 11 7 7 2 1
gdata
版本(使用reorder.factor
):
str(transform(data, group=gdata:::reorder.factor(group,-num)))
'data.frame': 6 obs. of 2 variables:
$ group: Factor w/ 6 levels "A","B","C","D",..: 3 6 4 2 1 5
$ num : num 12 11 7 7 2 1
这篇关于重新排序因子给出不同的结果,具体取决于装入的软件包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!