【问题标题】:duplicated levels in factors will be forbidden April 2017. What about the levels function?2017年4月将禁止因子中的重复级别。级别功能如何?
【发布时间】:2016-08-22 16:40:33
【问题描述】:

在 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 对后者的处理方式与前者不同。

这是记录在案的关卡行为,我没有利用未说明的元素。在 ?levels 中,有一个允许重复级别的示例。我将其粘贴进去以节省查找时间。

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

【问题讨论】:

    标签: r


    【解决方案1】:

    因子用于创建分类变量。该变量的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
    

    【讨论】:

    • 这并不能帮助我理解为什么 R factor() 和 levels()
    • 为什么因子变量中有重复的类别?
    • @pauljohn32 在您的代码 xf &lt;- factor(x, levels = c("a", "b", "c", "d"), labels = c("a", "a", "a", "d")) 中,您正在尝试创建一个具有重复类别的因子,这是对因子变量的无效操作。例如,标签中的值将覆盖级别参数。
    • factor() 用于创建新的分类变量。 levels() 用于修改分类变量。两者都有不同的目的——创造 |修改
    • 如果你像xf &lt;- factor(x, levels = c("a", "b", "c", "d"), labels = unique(c("a", "a", "a", "d")))一样使用unique,那么你会因为级别和标签参数之间的长度冲突而出错
    猜你喜欢
    • 2012-11-26
    • 2020-03-15
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多