【问题标题】:Adding levels in atomic vector in R (without using factor() function)在 R 中的原子向量中添加级别(不使用 factor() 函数)
【发布时间】:2017-06-15 05:22:39
【问题描述】:

我正在阅读 Hadley 的 Advanced R 并且正在尝试使用 levels。他说,当因子被正确创建时,人们不应该能够将不正确的因子添加到向量中。我不小心创建了原子向量的级别,nlevels() 确实指示了正确的级别数,但我可以添加一个因子。

这是我的代码:

y<- c(1:5,"a","b")
levels(y)<- c("1","2","3")
nlevels(y) #The output is 3

现在,让我们再次检查y:

`y`
"1" "2" "3" "4" "5" "a" "b"
attr(,"levels")
"1" "2" "3"

我们注意到y 不是上述因素。

但是,现在当我使用 factor() 创建一个因子时,我看到了传统的因子变量:

z<-factor(c(1:5,"a","b"))

我得到五个因素。此外,当我尝试添加另一个不是因素的元素时,它适用于y,但不适用于z:

z[8] <- -1 #generates NA (as expected)
y[8]<-1 #This gets added.

现在,当我运行 class() 命令时,

class(z) #it shows factor
class(y) #it shows atomic vector

现在,我的困惑是当我为非因子变量创建级别时会发生什么?为什么我可以给它添加关卡? nlevels() 也返回正确数量的因子。我会很感激任何想法。我搜索了 SO 并没有找到关于 SO 的解释。

【问题讨论】:

    标签: r


    【解决方案1】:

    您的前提似乎有问题。 'z"m 有一个 '1'- 级别,因此没有创建 NA:

    > z<-factor(c(1:5,"a","b"))
    > z
    [1] 1 2 3 4 5 a b
    Levels: 1 2 3 4 5 a b
    
    
    > nlevels(z)
    [1] 7
    

    创建levels 属性就像将任何其他属性附加到向量一样。您可以定义一个 add_any_old_attribute 函数,该函数将采用属性名称和值向量,如果有人发现它的用途,它就会在那里。除了 attr&lt;--function 的作用。 levels&lt;- 只是 attr&lt;- 函数的一个特殊版本。

    【讨论】:

    • - 感谢您的帮助,但为什么 nlevels(y) 有效(因为我看到为 y 创建了 3 个级别),并且我能够添加一个不是级别的数字在y?我还不清楚
    • 不确定是什么问题。您的 y-object 不是一个因素。如果你这样做:y &lt;- factor(y) 你将有 7 个级别。 factor-函数比 levels 进行更多的错误检查。
    • 没错。你所描述的行为也是哈德利所说的。我本来希望levels() 阻止我们向向量y 添加一个未在levels 中指定的数字。我同意 y 对象不是一个因素,但是当我调用 str(y) 和 nlevels() 时它确实表现得像一个因素
    • 不。除非我做 y str 报告 Y 是一个原子向量。 nlevels 只查看级别属性。您可能会争辩说 levels&lt;- 不应该能够修改向量,但我不确定您在 r-devel 邮件列表中能走多远。
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多