我理解 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
另一个潜在的复杂问题是不同列的因子水平顺序是否相同。作为示例,让我们更改其中一个大写列的因子顺序。这产生了一个新问题,即相同的字母在不同的列中可以具有不同的代码值,并且相同的代码可以分配给不同的字母。例如,A
在 x
列中具有代码 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/