如何获得R中每个因子变量的水平

时间:2017-12-31 06:09:22

标签: r

我理解R按字母顺序将值分配给因子向量。在以下示例中:

x <- as.factor(c("A","B","C","A","A","A","A","A","A","B","C","B","C","B","C","B","C"))
str(x)

打印

Factor w/ 3 levels "A","B","C": 1 2 3 1 1 1 1 1 1 2 ...

由于我只有三个级别,因此更容易理解级别 - 值关联,即A = 1,B = 2,依此类推。

在我有数百个因素的情况下,是否有更简单的方法将其打印为一个表格,显示所有因素以及它的级别值,如下所示:

Levels  Values
A        1
B        2
C        3

1 个答案:

答案 0 :(得分:2)

为什么您想知道R分配给每个因子级别的基础数值?我问,因为这通常不是一个重要的事情要跟踪。你能说更多关于你想要完成的事情吗?如果我们了解您正在尝试解决的潜在问题,我们可能会提供更多建议。现在,下面是如何做你要求的例子,也说明为什么结果可能不是你所期望的。

数据框中的所有列都具有相同基础类别的不同组合吗?如果没有,你所要求的可能会产生意想不到的不良后果。下面是几个例子,基于具有3个因子列的假数据框,其中两个是大写字母,其中一个是小写字母。

# Fake data
set.seed(2)
x = c("C","A","B","C","A","A","A","A","A","A","B","C","B","C","B","C","B","C")
dat = data.frame(x=x,
                 y=sample(LETTERS[1:5], length(x), replace=TRUE),
                 z=sample(letters[1:3], length(x), replace=TRUE),
                 w=rnorm(length(x)))

请注意,分配给每个因子级别的数字代码在列之间不是唯一的。小写字母和大写字母都可以包含因子代码1到3。

# Return a list with factor levels and numeric codes for each factor column
lapply(dat[ , sapply(dat, is.factor)], function(v) {
  data.frame(Levels=levels(unique(sort(v))),
             Values=as.numeric(unique(sort(v))))
  })
$x
  Levels Values
1      A      1
2      B      2
3      C      3

$y
  Levels Values
1      A      1
2      B      2
3      C      3
4      D      4
5      E      5

$z
  Levels Values
1      a      1
2      b      2
3      c      3

另一个潜在的复杂因素是不同列的因子水平的顺序是否相同。例如,让我们更改其中一个大写列的因子顺序。这会产生一个新问题,即同一个字母在不同的列中可以具有不同的代码值,并且可以将相同的代码分配给不同的字母。例如,Ax列中包含代码1,在列y中包含代码5。此外,代码1已分配到E列中的y,而不是A

dat$y = factor(dat$y, levels = LETTERS[5:1]) 

# Return a list with factor levels and numeric codes for each factor column
lapply(dat[ , sapply(dat, is.factor)], function(v) {
  data.frame(Levels=levels(unique(sort(v))),
             Values=as.numeric(unique(sort(v))))
})
$x
  Levels Values
1      A      1
2      B      2
3      C      3

$y
  Levels Values
1      E      1
2      D      2
3      C      3
4      B      4
5      A      5

$z
  Levels Values
1      a      1
2      b      2
3      c      3