从字母数字子集中提取后,将因子级别重新排序为数字

时间:2017-04-12 13:23:33

标签: r sorting subset r-factor

我有一个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)

2 个答案:

答案 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(...))更好。