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

时间:2011-08-19 23:27:57

标签: 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"

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

> 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))检索的内容?

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

2 个答案:

答案 0 :(得分:28)

我认为考虑labelslevels之间差异的方式(忽略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"中包含levelsf,因此即使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