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

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 

所以,我的问题由两部分组成:

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

  • 对于脚本和输出可以有不同的因子级别名称吗?

背景:对于较长的脚本,短因素级别的脚本似乎更容易。 但是,对于报告和绘图,这个短的因素水平可能不够,应该用高级名称代替。

非常短:水平是input,标签是factor()函数中的输出。 一个因子只有一个level属性,由factor()函数中的labels参数设置。 这与统计软件包(如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" 

我写了一个包含“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要求级别是数字,以便他们不能与标签混淆。