2017年4月起,禁止因素中存在重复级别。那么levels函数呢?

5
在R-devel列表中,Martin Maechler发布了一条关于因子中重复级别的信息。
“自2009年以来,具有非唯一(重复)级别的因子已被弃用 - 现在更加被弃用…”。它在2016年6月4日被发布。
它说明在预定于2017年4月的R 3.4中,重复级别将导致错误,而不再仅仅是警告。
我想知道为什么levels函数没有引起类似的警告?这里我将前三个级别组合成两种方式的“a”,其中一种已被弃用。
例子
> x <- c("a", "b", "c", "d")
> xf <- factor(x, levels = c("a", "b", "c", "d"), 
    labels = c("a", "a", "a", "d"))
Warning message:
In `levels<-`(`*tmp*`, value = if (nl == nL) 
    as.character(labels) else paste0(labels,  :
    duplicated levels in factors are deprecated
> xf <- factor(x)
> levels(xf) <- c("a", "a", "a", "d")
> xf
[1] a a a d
Levels: a d

我希望能够理解为什么R对后者的处理方式与前者不同。
这是levels的记录行为,我没有利用未经声明的元素。在?levels中,有一个示例允许重复的级别出现。我会将其粘贴以节省您的查找时间。
## combine some levels
z <- gl(3, 2, 12, labels = c("apple", "salad", "orange"))
z
levels(z) <- c("fruit", "veg", "fruit")
z
1个回答

0

因子用于创建分类变量。该变量的Levels属性表示不同的类别。一个变量不能有重复的类别,这是没有意义的。然而,一个变量可以有相同类别的重复数据值。

分类变量中的数据以整数向量表示。使用unclass查看整数向量。levels属性表示该变量的类别。例如,该变量的第一个值属于特定的类别,并将被分配为1号。如果它是有序因子,则最低类别将被分配为1号。

x <- c(letters[1:3], letters[1:3])
xf <- factor(x)

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

attributes(xf)
# $levels
# [1] "a" "b" "c" 
# 
# $class
# [1] "factor"

unclass(xf)
# [1] 1 2 3 1 2 3
# attr(,"levels")
# [1] "a" "b" "c"

如果一个类别在变量中没有值,那么它将被分配为NA
factor(c("a", "b", "c"), levels = c("e", "f", "g"))
# [1] <NA> <NA> <NA>
#   Levels: e f g

labels 是一个可选参数,用于更改类别的名称。如果变量具有与级别参数相对应的数据值,则将给定标签参数中的值赋予它。请注意,“e”值被赋予了类别“h”。

factor(c("a", "b", "e"), levels = c("e", "f", "g"), labels = c("h", "i", "j"))
# [1] <NA> <NA> h   
# Levels: h i j

现在levels()是一个替换函数,用于更改因子变量中存在的数据。在levels()函数中使用的数据必须对应于因子变量。否则会创建垃圾数据。

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

将值中的"a"更改为"e","b"更改为"f","c"更改为"g"。此示例展示了如何正确转换因子变量的类别名称。

levels(xf) <- c("e", "f", "g", "e", "f", "g")
> xf
# [1] e f g e f g
# Levels: e f g

现在是垃圾类型:请注意,数据与因子变量xf不对应。要查看整数向量,请使用unclass(xf)

levels(xf) <- c("m", "m", "m", "n", "n", "n")
xf
# [1] m m m m m m
# Levels: m n

@pauljohn32 在你的代码 xf <- factor(x, levels = c("a", "b", "c", "d"), labels = c("a", "a", "a", "d")) 中,你试图创建一个带有重复类别的因子变量,这是无效的操作。例如,标签中的值将覆盖级别参数。 - Sathish
如果您在使用 unique 时,像这样 xf <- factor(x, levels = c("a", "b", "c", "d"), labels = unique(c("a", "a", "a", "d"))),那么您将会得到一个错误,因为级别和标签参数的长度冲突。 - Sathish
关键在于 length(levels) = length(labels)。如果您看到函数 factor 的用法,它表示 levels = labels,这暗示标签参数中的值将被分配给 levels 参数。请检查此代码 xf <- factor(x, labels = unique(c("a", "a", "a", "d", "b", "c"))) - Sathish
分类变量:factor() - 创建;levels() - 修改。 - Sathish
分类变量 factor() 参数:1. levels - 指示不同的类别;2. labels - 根据 levels 参数中指定的名称更改类别的名称;3. exclude - 从变量中删除一个类别。 - Sathish
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接