r - 如何获取 R 中每个因子变量的水平

标签 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

最佳答案

为什么您想知道 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 分配给 y 列中的 E,而不是分配给 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

关于r - 如何获取 R 中每个因子变量的水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040433/

相关文章:

r - 为什么 summarize() 中的 cur_data() 会返回 df_slice() 错误?

r - 如何在调查包中的 svyttest 函数中使用 for 循环?

r - 将术语文档矩阵转换为 R 中的节点/边缘列表

r - 用数字和字母分割字符串

r - 通过 R 创建可填充的 PDF 文本框

r - 为每个因素组添加单独的 vlines 到 ggplot(可变重要性随机森林的点图)

r - 如何从 R 脚本调用 linux 终端代码

c++ - 使用带有 typedef 的 Rcpp 的编译错误

r - 如何在 r 中针对 "gambling"问题和返回概率编写模拟?

r - Shinymanager 通过单击按钮注销