第一次在StackExchange上发帖,如果格式不正确,请原谅我!
如果我在 R 中指定向量 v 的级别,然后调用 Factor(v),则并非所有级别都会显示。我试图找出为什么会出现这种情况,因为当我为我正在处理的项目调用因子时,我需要查看所有级别(包括“空”级别)。
一个非常简单的复制:
x <- c('a', 'a', 'b', 'b', 'c', 'c')
levels(x) <- c('a', 'b', 'c', 'd')
现在,如果我们调用
levels(x)
,它将准确输出您所期望的内容:
> levels(x)
[1] "a" "b" "c" "d"
但是,调用时级别会发生变化
factor(x)
:
> factor(x)
[1] a a b b c c
Levels: a b c
我引入的“d”级别发生了什么?我知道没有与此级别关联的数据点,但我不明白为什么当我调用“因子”时应删除该级别。不幸的是,当我调用“因素”时,我需要能够引用所有级别,那么有没有办法解决这个问题?
当您第一次创建
x
时,它的类是character
。当你给它赋值 levels
时,它获得了 levels
属性,但它仍然是 character
类,而不是 factor
:
x <- c('a', 'a', 'b', 'b', 'c', 'c')
levels(x) <- c('a', 'b', 'c', 'd')
class(x)
# [1] "character"
str(x)
# chr [1:6] "a" "a" "b" "b" "c" "c"
# - attr(*, "levels")= chr [1:4] "a" "b" "c" "d"
当您在对象上调用
factor
时,它会转换为 factor
类,并且如 ?factor
文档所述,默认级别为
levels
x 可能采用的唯一值(作为字符串)的可选向量。默认值是
采用的唯一值集,按as.character(x)
的升序排序。请注意,该集合可以指定为小于x
。sort(unique(x))
不考虑任何现有级别。
y = factor(x)
str(y)
# Factor w/ 3 levels "a","b","c": 1 1 2 2 3 3
即使我们从
factor
类对象开始,再次调用 factor
也会使用默认级别“重构”它。
z = factor(c('a', 'a', 'b', 'b', 'c', 'c'))
levels(z) <- c('a', 'b', 'c', 'd')
str(z)
# Factor w/ 4 levels "a","b","c","d": 1 1 2 2 3 3
z = factor(z)
str(z)
# Factor w/ 3 levels "a","b","c": 1 1 2 2 3 3
至于解决方法:
不要对已经是
factor
的东西调用factor
,除非你想改变级别。目前尚不清楚为什么需要这样做。使用 is.factor()
测试您的对象是否是一个因素,如果还不是,则仅对其调用 factor()
。
如果您确实必须在
factor
对象(甚至是具有 factor
属性的 character
对象)上调用 levels
并希望保留其级别,请在 levels
参数中指定其旧级别,例如,x = factor(x, levels = levels(x))
。