我有一个问题的变体,在不更改值顺序的情况下对因子的水平进行重新排序不会回答:数据集中的变量具有混合的数字和字符串(我知道这是不可取的,但它就在那里(,就像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)
笨拙,但是:
factor(ss$b,levels=sort(unique(as.numeric(as.character(ss$b)))))
或者也许更直接
ss <- droplevels(subset(df, b != "default"))
但是,我质疑你的说法
在构建初始因子时,级别保持顺序(如找到的,已排序(。
在我看来,它们是按字母顺序排序的?
一个真实的子集(原始数据太多而无法粘贴到此处(最初具有这样的因素(包括过时级别(:
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(...))
更好。