重新排序因子会给出不同的结果,具体取决于加载的包 [英] 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
推荐答案
出现这种情况是因为:
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
在 base 中不存在
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
):
The base R version (using 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屋!