在R中添加原子向量中的级别(不使用factor()函数)

时间:2017-01-30 05:12:08

标签: r

我正在阅读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上找到解释。

1 个答案:

答案 0 :(得分:0)

你的前提似乎有问题。 “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<- - 函数的作用。 levels<-只是attr<-函数的专用版本。