因子水平和因子标签之间的混淆


106

R中某个因子的级别和标签之间似乎存在差异。到目前为止,我一直认为级别是因子级别的“真实”名称,而标签是用于输出的名称(例如表格和图表) 。显然,情况并非如此,如以下示例所示:

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

我认为编写脚本时仍可以访问级别('a','b','c'),但这不起作用:

> df$f=='a'
[1] FALSE FALSE FALSE

但这确实是:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE

因此,我的问题包括两部分:

  • 级别和标签之间有什么区别?

  • 脚本和输出的因子级别是否可以使用不同的名称?

背景:对于较长的脚本,使用短因子级别的脚本似乎要容易得多。但是,对于报告和地块,此短因子水平可能不足,应使用更精确的名称代替。

Answers:


131

非常短:factor()函数中的级别是输入,标签是输出。因子只有一个level属性,该属性由labels函数中的参数设置factor()。这与SPSS等统计软件包中的标签概念不同,一开始可能会造成混淆。

您在此代码行中所做的

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))

告诉R有一个向量 df$f

  • 您想将其转化为一个因素,
  • 其中不同级别被编码为a,b和c
  • 并希望将其级别标记为“处理A”等。

因子函数将查找值a,b和c,将它们转换为数值因子类,并将标签值添加到level因子的属性。此属性用于将内部数值转换为正确的标签。但是如您所见,没有label属性。

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(df$f)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

> df$f <- factor(df$f, levels=c('a','b','c'),
+   labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"

1
感谢您的快速回答!我想我现在已经了解了级别和标签的目的。也许有什么建议可以使输出更加人性化,而无需手动编辑表名和图例?
donodarazao 2011年

6
我经常会在绘制/创建标签之前转换级别,例如,在操作时将级别保持为“ a”,“ b”,“ c”,然后使用level(f)<-paste(“ Treatment”,toupper(levels( f)),sep =“”)[或某些内容]。或创建一个随身携带的因子f_pretty,仅用于输出...
Ben Bolker

我考虑过两种,但是两种方法都有缺点。当绘制大量图形时,第一个可能会很乏味,而脚本编写中涉及大量数据聚合时,第二个可能会很乏味。但是显然没有办法轻松避免这种情况,因此我会同意您的建议。:)
donodarazao

@ 42-我不确定您对“数字值”的含义。如果您将内部值表示为因子,那正是我上面所说的。因此,提到内部数值。如果指定levels参数,则在输入中提供必须与labels参数匹配的值。R保留标签(作为attribute levels,并且存在混淆)并在内部存储整数代码。这些整数代码与原始值无关,无论它们是什么类型。我想你误会了我。
乔里斯·梅斯

道歉。您写的也是我的理解,现在我在重新阅读您的问题,所以我看不到我以为您说的不同。我将删除我的评论,因为它添加的内容几乎没有。
IRTFM'1

17

我编写了一个软件包“ lfactors”,使您可以引用级别或标签。

# packages
install.packages("lfactors")
require(lfactors)

flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads"))
# Tails can now be referred to as, "Tails" or 0
# These two lines return the same result
flips == "Tails"
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE
flips == 0 
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

请注意,lfactor要求级别为数字,以便它们不会与标签混淆。


3
这是一个很好的程序包,感谢您发布它(并编写)。似乎应该是R因子所固有的某种功能-很高兴看到一个提供此类名称-值对映射以及内置等效性检查功能的软件包。
索伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.