我有一个Reorder levels of a factor without changing order of values没有回答的问题的变体:
数据集中的变量具有混合数字和字符串(我知道这是不合需要的,但它就在那里),如4 8 16 64 128 default
。在构建初始因子时,级别按顺序保存(如找到的那样,已排序)。
但是,当我构建子集(需要清除过时级别)时,级别将按字符串排序,如128 16 4 64 8
,即使子集仅包含数字级别。执行boxplot(var ~ factor)
时这很糟糕。
尝试使用上述问题(factor(var, levels=sort(var)
)中找到的解决方案,级别以重复结束。
大多数类似的答案都假定级别是已知的,在我的情况下不是这样。如何对因子进行排序以便对级别进行排序。
示例:
> a<-c(1,3,5,7,2)
> b<-c(4,8,16,32,"default")
> df<-data.frame(a, b)
> df$b<-factor(df$b)
> str(df)
'data.frame': 5 obs. of 2 variables:
$ a: num 1 3 5 7 2
$ b: Factor w/ 5 levels "16","32","4",..: 3 4 1 2 5
> ss<-subset(df, b != "default")
> factor(ss$b)
[1] 4 8 16 32
Levels: 16 32 4 8
> factor(ss$b,levels=sort(ss$b))
[1] 4 8 16 32
Levels: 16 32 4 8
ss$b<-factor(ss$b,levels=sort(ss$b))
boxplot(ss$a ~ ss$b)
答案 0 :(得分:1)
笨重但是:
factor(ss$b,levels=sort(unique(as.numeric(as.character(ss$b)))))
或者更直接
ss <- droplevels(subset(df, b != "default"))
但是,我质疑你的断言
在构建初始因子时,级别按顺序保存(如找到的那样,已排序)。
对我来说,他们按字母顺序排序?
答案 1 :(得分:1)
一个真正的子集(原始数据太多,无法在此粘贴)最初有一个这样的因素(包括陈旧的水平):
Levels: 0 128 16 256 32 4 512 64 8 deadline noop
重新计算因子(factor(ss$tune.val)
),等级为:
Levels: 128 16 256 32 4 512 64 8
这个表达带来了理想的结果,但对我来说看起来有点复杂:
factor(ss$tune.val, levels=sort(as.numeric(levels(factor(ss$tune.val)))))
(...)
Levels: 4 8 16 32 64 128 256 512
可能unique(...)
比使用levels(factor(...))
更好。