在 R 中匹配级别时值会发生变化。

Values are changing while matching levels in R.

我有 2 个变量 x 和 y。在 X 中,我只有 1 个值和 1 个级别。我想匹配 y 到 x 的水平。匹配级别后,级别匹配但 X 的值正在改变。为什么会这样?

x = as.factor(c(3))    
> x
3
Levels: 3

y = as.factor(c(2,3,4))
> y
2 3 4
Levels: 2 3 4

输出 -

levels(x) = levels(y)

print(x)
 2

Levels: 2 3 4

X 的初始值为 3,现在为 2。

我认为这是因为 R 提供了新的级别而不是值。 例如,如果您执行 as.numeric(x),它将显示 1 而不是 3。

x <- as.factor(c(3))  
as.numeric(x)

[1] 1

但是,如果您使用 varhandle::unfactor() 对变量进行分解,它将显示 "real" 值。

varhandle::unfactor(x)

[1] 3

因此,当您执行 levels(x) <- levels(y) 时,您不会 relevel/refactor x 的级别与 y 一样 - 您 adjusting/changing 级别和值。

x <- as.factor(c(3))  
y <- as.factor(c(2,3,4))
levels(x) <- levels(y)
unfactor(x)

[1] 2

这样做x <- factor(x, levels = union(levels(x), levels(y))) 将解决您的问题。

x <- as.factor(c(3))  
y <- as.factor(c(2,3,4))
x

[1] 3 Levels: 3

x <- factor(x, levels = union(levels(x), levels(y)))
x

[1] 3 Levels: 2 3 4

unfactor(x)

[1] 3

感谢@pieca 的评论。

R 因子是真正的正整数向量,它有一个 levels 属性用作查找 "table"。在您的示例中发生的情况是 x 的值为 1(因为 levels(x) 中只有一项恰好是字符“3”)。当您将 levels 属性替换为字符向量时:c( '2', '3', '4') 结果是使用 1 作为该向量的索引,返回第一个项目现在是字符“2”的级别属性。

改变因素的水平确实相当危险。如果您想扩展关卡,安全的做法是遵循以下原则:

x <- factor( as.character(x), levels = union(levels(x), levels(y) ) )