我有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
输出 -
级别(x)=级别(y)
print(x) 2
级别:2 3 4
X的初始值现在是2,而
答案 0 :(得分:2)
R因子实际上是正整数向量,具有levels
- 属性,用作查找“表”。你的例子中发生的事情是x的值是1(因为levels(x)
中只有一个项恰好是字符“3”)。当您使用字符向量替换levels
- 属性时:c('2','3','4')后果是使用1
作为该向量的索引返回第一个项目等级属性,现在是字符 - “2”。
绕过不断变化的因素水平真的很危险。如果你想扩展关卡,那么安全的方法就是这样:
x <- factor( as.character(x), levels = union(levels(x), levels(y) ) )
答案 1 :(得分:1)
我认为这是因为R表示新级别而不是值。
例如,如果您执行as.numeric(x)
,它将显示1而不是3.
x <- as.factor(c(3))
as.numeric(x)
[1] 1
但是,如果您使用varhandle::unfactor()
解构变量,它将显示&#34; real&#34;值。
varhandle::unfactor(x)
[1] 3
因此,当你执行levels(x) <- levels(y)
时,你不会将x的级别重新定义/重构为y - 你调整/改变级别和值。
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级:3
x <- factor(x, levels = union(levels(x), levels(y)))
x
[1] 3级:2 3 4
unfactor(x)
[1] 3
感谢@pieca的评论。