【问题标题】:Why is the terminology of labels and levels in factors so weird?为什么因子中的标签和级别的术语如此奇怪?
【发布时间】:2011-10-31 00:01:54
【问题描述】:

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

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

【问题讨论】:

  • 请注意,在您的第二个和第三个示例中,facstr(fac) 会显示您的因子都是 NAs,因为您提供的 levels 规范与x 的值 ...

标签: r levels factors


【解决方案1】:

我认为考虑labelslevels 之间区别的方式(忽略Tommy 在他的回答中描述的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中没有找到,所以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

在 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

考虑levels 的另一种方式是factor(x,levels=L1,labels=L2) 等价于

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

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

【讨论】:

  • 你听上去更赞同我的看法,那就是“清如泥”。我不明白“levels 旨在告诉 R 在输入 (x) 中查找哪些级别”这句话。也没有任何功能labels&lt;- 可以像您所说的“在输入编码后更改级别的名称”。无论如何,它们不是名称(在 R 意义上)。它们是属性中的值。
  • 我同意该术语令人困惑。我更新的答案有帮助吗?
  • 确实如此。特别是关于输入和输出的澄清。有点像 SAS 的信息和格式。
  • 我们可以说(在类似 SPSS 的术语中):Levels 是可能的/acaptable/有效的值。 LabelsValue Labels 吗?例如从 0 到 4 的等量表:levels=0:4 和值标签:labels=c("yes", "maybe yes", "maybe no", "no")
【解决方案2】:

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

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

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

一个因素没有标签。它只有级别。 factorlabels 参数只是一种能够给出一组字符串但产生另一组字符串作为级别的方法...... 但为了进一步混淆,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)

【讨论】:

  • 差不多,稍作修正。如果没有名称,labels 返回 序列号 (seq_along(x)) 强制转换为字符串 ...
  • @Ben Bolker,是的,你是对的 - 我不应该尝试像 labels(1:3) 这样的东西 :-)。我更新了答案。
  • 该答案存在三个问题。 (1) 对于因素,labels 确实 not 返回使用 as.character(fac) 会得到的结果,这就是我解释您的语句“返回强制转换为字符串的值”的方式。 (2) 你能解释一下为什么labels 函数没有返回factor 的“labels”参数设置的内容吗? (3) 为什么“标签”胜过“等级”?
  • @Dwin (2) 可能是因为labels 不是为提取因子标签而设计的。
  • @Ben Bolker .Label 仅出现在 dput 之后。参见 unclass(fac)。而如果你分配dput的结果,那么你就找不到.Label
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多