新的因子级别分配行为异常,具体取决于列表中新因子字符串的位置

时间:2018-12-19 20:11:59

标签: r categorical-data

我知道向类factor的对象添加新级别非常简单。但是,当我将要添加的因子级别放在列表的第一个位置时,对象(向量)中的实际值会发生变化。

这是我在说的:

test <- factor(c("a", "a", "a", "b", "c", "a", "c", "b"))

test
#[1] a a a b c a c b
#Levels: a b c

levels(test)
#[1] "a" "b" "c"

## Works OK
levels(test) <- c(levels(test), "d")
#[1] a a a b c a c b
#Levels: a b c d

levels(test) <- c("d", levels(test))

## The values have changed
test
#[1] d d d a b d b a
#Levels: d a b c

我很好奇为什么新因子级别在列表中的位置会影响因子级别,并且因子本身也会被修改。

1 个答案:

答案 0 :(得分:0)

因子的级别是与基础整数值变量(枚举)关联的字符串。

如果我们检查此变量的底层结构:

test <- factor(c("a", "a", "a", "b", "c", "a", "c", "b"))

我们看到:

str(test)
## Factor w/ 3 levels "a","b","c": 1 1 1 2 3 1 3 2

levels()的作用是按顺序将代码分配给整数值 levels(test) <- c("d","a","b","c")使对应关系1 <->“ d”,2 <->“ a “,3 <->” b“,4 <->” c“。因此,具有基础值1(向量的第一到第三和第六个元素)的值现在具有关联的标签“ d”。

添加新级别的更安全方法是:

test <- factor(test,levels=c("d","a","b","c"))
test
## [1] a a a b c a c b
## Levels: d a b c
str(test)
## Factor w/ 4 levels "d","a","b","c": 2 2 2 3 4 2 4 3

这会更改级别的顺序(这对于绘制和参数化统计模型很重要),但是在分配整数值时会使用字符值...