2017年4月将禁止重复的因素水平。水平功能怎么样?

时间:2016-08-22 16:40:33

标签: r

在R-devel列表中,Martin Maechler发布了一条关于因子中重复级别的消息

  

“自2009年以来已弃用非唯一(重复)级别的因素 - 更多现已弃用......”June 4, 2016

它指出,在计划于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

我想理解为什么后者对R的处理方式与前者不同。

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

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

1 个答案:

答案 0 :(得分: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是一个可选参数,用于更改类别的名称。如果变量具有根据levels参数的数据值,那么将给予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