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
所以,我的问题包括两部分:
关卡和标签之间有什么区别?
脚本和输出的因子级别是否可以有不同的名称?
背景:对于较长的脚本,使用较短因子级别的脚本似乎要容易得多。但是,对于报告和图表,这个较短的因子水平可能不够,应该用精简者名称替换。
答案 0 :(得分:115)
非常短:级别是输入,标签是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,将它们转换为数字因子类,并将标签值添加到因子的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 :(得分:12)
我写了一个包&#34; lfactors&#34;允许您引用任何级别或标签。
# 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要求级别为数字,以便不会与标签混淆。