(R)“因子”函数丢弃向量中的指定级别

问题描述 投票:0回答:1

第一次在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”级别发生了什么?我知道没有与此级别关联的数据点,但我不明白为什么当我调用“因子”时应删除该级别。不幸的是,当我调用“因素”时,我需要能够引用所有级别,那么有没有办法解决这个问题?

r r-factor
1个回答
0
投票

当您第一次创建

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))

© www.soinside.com 2019 - 2024. All rights reserved.