在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
答案 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