r语言 - 从字母数字子集中提取后,将因子水平重新排序为数字



我有一个问题的变体,在不更改值顺序的情况下对因子的水平进行重新排序不会回答:数据集中的变量具有混合的数字和字符串(我知道这是不可取的,但它就在那里(,就像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(...))更好。

最新更新