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