不可设置函数的示例是labels
。您只能在使用因子函数创建因子标签时设置它们。没有labels<-
功能。并非因素中的'标签'和'水平'有任何意义......
> fac <- factor(1:3, labels=c("one", "two", "three"))
> fac
[1] one two three
Levels: one two three
> labels(fac)
[1] "1" "2" "3"
好的,我问过标签,人们可能会认为这是因素调用所设定的,但是我得到了一些东西......这个词是什么,不直观?
> levels(fac)
[1] "one" "two" "three"
所以看来设置标签确实是设置级别。
> fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one" "two" "three"
好的,这是预期的。那么当设置水平时标签是什么?
> fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") )
> labels(fac)
[1] "1" "2" "3"
> levels(fac)
[1] "x" "y" "z"
如果你问我,很奇怪。似乎因素的“标签”参数胜过级别规范的任何“级别”参数。为什么会这样?看起来像一个混乱的术语。为什么labels()
会返回我想象的用as.character(as.numeric(fac))检索的内容?
(这是一个切向评论[标记为]在早期的答案中,我被要求转移到一个问题的分配函数。所以这是你给我启发的机会。)
答案 0 :(得分:28)
我认为考虑labels
和levels
之间差异的方式(忽略Tommy在其答案中描述的labels()
函数)是levels
旨在告诉R要在输入中查找哪些值(x
)以及在生成的factor
对象的级别中使用什么顺序,而labels
则更改值<输入被编码为因子后的级别的/ em> ...正如Tommy的回答所建议的那样,factor
返回的factor()
对象中没有一部分被称为labels
只有水平,这些水平已经被labels
参数调整了......(清楚如泥)。
例如:
> f <- factor(x=c("a","b","c"),levels=c("c","d","e"))
> f
[1] <NA> <NA> c
Levels: c d e
> str(f)
Factor w/ 3 levels "c","d","e": NA NA 1
由于在x
中未找到levels
的前两个元素,因此f
的前两个元素为NA
。由于"d"
和"e"
中包含levels
和f
,因此即使x
中未出现labels
,它们也会显示在> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("C","D","E"))
> f
[1] <NA> <NA> C
Levels: C D E
级别。
现在使用> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("a","b","c"))
> f
[1] <NA> <NA> a
Levels: a b c
:
levels
在R计算出因子中应该包含的内容之后,它会对级别进行重新编码。当然,人们可以使用它来做脑力煎炸,例如:
factor(x,levels=L1,labels=L2)
考虑f <- factor(x,levels=L1)
levels(f) <- L2
的另一种方式是{{1}}等同于
{{1}}
我认为这个例子的适当措辞版本可能对Pat Burns的R inferno很好 - 在8.2节中有很多因素难题,但不是这个特别的...
答案 1 :(得分:15)
labels
函数听起来非常适合获取因子的标签。
...但labels
功能与因素无关!它被用作获取“标记”对象的通用方法。对于原子向量,这将是名称。但是如果没有名称,labels
函数会返回强制转换为字符串的元素索引 - 类似于as.character(seq_along(x))
。
...这就是你在一个因素上尝试标签时所看到的。因子是一个没有任何名称的整数向量,但具有levels
属性。
因素没有标签。它只有水平。 labels
的{{1}}参数只是一种能够提供一组字符串但是生成另一组字符串作为级别的方法...
但为了进一步混淆,factor
函数将dput
属性打印为levels
!我认为这是遗产......
.Label
但是,由于# Translate lower case letters to upper case.
f <- factor(letters[2:4], letters[1:3], LETTERS[1:3])
dput(f)
#structure(c(2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor")
attributes(f)
#$levels
#[1] "A" "B" "C"
#
#$class
#[1] "factor"
是一个通用函数,因此如下定义labels
可能是个好主意(目前没有)。也许R核心要考虑什么?
labels.factor