在 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) ) )
我有 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) ) )