为什么标签和级别的术语如此奇怪?

42-*_*42- 34 r levels factors

一个不可设置的函数的例子是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"
Run Code Online (Sandbox Code Playgroud)

好吧,我问过标签,人们可能认为这是由因子调用设定的,但是我得到了一些东西......这个词是什么,不直观?

> levels(fac)
[1] "one"   "two"   "three"
Run Code Online (Sandbox Code Playgroud)

所以看来设置标签确实是设置级别.

>  fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one"   "two"   "three"
Run Code Online (Sandbox Code Playgroud)

好的,这是预期的.那么设置水平时标签是什么?

>  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"
Run Code Online (Sandbox Code Playgroud)

如果你问我,会很奇怪.似乎因素的"标签"参数胜过级别规范的任何"级别"参数.为什么会这样?看起来像一个混乱的术语.为什么labels()返回我想象的用as.character(as.numeric(fac))检索的东西?

(这是一个切向评论[标记为]在早期的关于赋值函数的答案中,我被要求转移到一个问题.所以这是你有机会启发我.)

Ben*_*ker 29

我认为考虑labelslevels(忽略labels()Tommy在他的答案中描述的函数)之间的区别的方法是,levels它旨在告诉R在input(x)中查找哪些值以及在结果的级别中使用什么顺序factor对象,并且labels是在输入被编码为因子之后更改级别的 ...正如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
Run Code Online (Sandbox Code Playgroud)

因为x没有找到levels前两个元素,前两个元素fNA.因为"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
Run Code Online (Sandbox Code Playgroud)

在R计算出因子中应该包含的内容之后,它会对级别进行重新编码.人们当然可以用这个来做脑力煎炸,例如:

> 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
Run Code Online (Sandbox Code Playgroud)

考虑另一种方式levels是,factor(x,levels=L1,labels=L2)相当于

f <- factor(x,levels=L1)
levels(f) <- L2
Run Code Online (Sandbox Code Playgroud)

我认为这个例子的适当措辞版本可能对Pat Burns的R inferno来说很好- 在8.2节中有很多因素难题,但不是这个特别的...


Tom*_*mmy 17

labels功能听起来非常适合获取因子的标签.

......但labels功能与因素无关!它被用作获取"标记"对象的通用方法.对于原子向量,这将是名称.但是如果没有名称,labels函数会返回强制转换为字符串的元素索引 - 类似于as.character(seq_along(x)).

...这就是你在一个因素上尝试标签时所看到的.因子是一个没有任何名称但带有levels属性的整数向量.

因素没有标签.它只有水平.该labels给的说法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"
Run Code Online (Sandbox Code Playgroud)

但是,由于它labels是一个通用函数,因此定义labels.factor如下(当前没有)可能是个好主意.也许是R核心需要考虑的事情?

labels.factor <- function(x, ...) as.character(x)
Run Code Online (Sandbox Code Playgroud)

  • @Ben Bolker` .Label`仅在`dput`之后出现.见unclass(fac).如果你分配`dput`的结果,那么你找不到`.Label`. (2认同)