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

don*_*zao 95 r r-faq r-factor

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

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

> df$f=='a'
[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

但这样做:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

所以,我的问题包括两部分:

  • 关卡和标签有什么区别?

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

背景:对于较长的脚本,使用较短因子级别的脚本似乎要容易得多.但是,对于报告和图表,这个较短的因子水平可能不够,应该用精简者名称替换.

Jor*_*eys 122

很短:级别是输入,标签是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'))
Run Code Online (Sandbox Code Playgroud)

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

  • 我经常在绘制/创建标签之前改变水平,例如在操纵时将水平保持为"a","b","c",然后使用水平(f)< - 粘贴("治疗",toupper(水平( f)),sep ="")[或某事]在绘图时.或者创建一个随身携带的并行因子f_pretty,仅用于输出... (6认同)
  • 感谢您的快速答复!我想我现在明白关卡和标签的目的了。也许有什么建议可以在不手动编辑表名和图例的情况下使输出更易于阅读? (2认同)

pdb*_*pdb 13

我写了一个包"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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的包,感谢发布它(并写它).看起来这种功能应该是R因子的本机 - 很高兴看到一个包提供这种具有内置等效性检查的名称 - 值对映射. (2认同)