2017年4月将禁止因子中的重复级别。级别功能如何?

pau*_*n32 5 r

在R-devel列表中,Martin Maechler发布了有关因子重复水平的消息

“与非唯一(重复)水平的因素已经自2009年以来弃用-被更多现在已经过时......” 2016年6月4日,

它指出,在计划于2017年4月发布的R 3.4中,重复的级别将导致错误,而不仅仅是警告。

我不知道为什么水平功能不会引起类似的警告?在这里,我以两种方式将前三个级别组合为“ 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
Run Code Online (Sandbox Code Playgroud)

我想理解为什么R与前者对待后者的区别。

这是记录的级别行为,我没有利用未声明的元素。在?levels中,有一个示例允许重复的级别。我将其粘贴以保存您的查找。

## combine some levels
z <- gl(3, 2, 12, labels = c("apple", "salad", "orange"))
z
levels(z) <- c("fruit", "veg", "fruit")
z
Run Code Online (Sandbox Code Playgroud)

Sat*_*ish 0

因子用于创建分类变量。该变量的属性Levels代表不同的类别。变量不能有重复的类别。它没有任何意义。但是,变量可以具有同一类别的重复数据值。

分类变量内的数据表示为整数向量。用于unclass查看整数向量。level 属性表示该变量的类别。例如,该变量的第一个值属于特定类别,它将被分配数字 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"
Run Code Online (Sandbox Code Playgroud)

如果某个类别在变量中没有值,那么它将被赋值为NA

factor(c("a", "b", "c"), levels = c("e", "f", "g"))
# [1] <NA> <NA> <NA>
#   Levels: e f g
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

xf
# [1] a b c a b c
# Levels: a b c
Run Code Online (Sandbox Code Playgroud)

“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
Run Code Online (Sandbox Code Playgroud)

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

levels(xf) <- c("m", "m", "m", "n", "n", "n")
xf
# [1] m m m m m m
# Levels: m n
Run Code Online (Sandbox Code Playgroud)