37

不可设置函数的一个例子是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)) 检索的内容?

(这是关于分配函数的较早答案中的一个切线评论[标记为此类],我被要求转到一个问题。所以这是你启发我的机会。)

4

2 回答 2

31

我认为思考和之间区别的方法labelslevels忽略labels()汤米在他的回答中描述的函数)是levels为了告诉 R 在输入(x)中查找哪些值以及在结果的级别中使用什么顺序factor对象,并且labels是在输入被编码为一个因素后更改级别的......正如汤米的回答所建议的那样,没有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,所以 的前两个元素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

在 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

另一种思考方式levelsfactor(x,levels=L1,labels=L2)相当于

f <- factor(x,levels=L1)
levels(f) <- L2

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

于 2011-08-19T23:46:20.490 回答
17

labels函数听起来非常适合获取因子标签。

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

...所以这就是您在尝试为某个因素添加标签时所看到的。该因子是一个没有任何名称但具有levels属性的整数向量。

因子没有标签。它只有级别。to的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"

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

labels.factor <- function(x, ...) as.character(x)
于 2011-08-19T23:33:40.087 回答