我知道向类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
我很好奇为什么新因子级别在列表中的位置会影响因子级别,并且因子本身也会被修改。
答案 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
这会更改级别的顺序(这对于绘制和参数化统计模型很重要),但是在分配整数值时会使用字符值...