在R中匹配级别时值正在变化

时间:2018-04-17 05:39:40

标签: r statistics levels

我有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,而

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的评论。