我正在阅读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上找到解释。
答案 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<-
函数的专用版本。