更改数据框列的级别会更改数据框中的值

Changing levels of dataframe column changes value in dataframe

我不明白这个逻辑:

x_value <- "yes"
df <- data.frame(
                x = x_value
            )

levels(df$x) <- c("no", "yes")

df

这导致:

df
   x
1 no

所以在我最初创建的一行中更改了 x 的值。当我将级别分配给数据框中的因子列时,这不是简单地定义元数据吗?

如何在分配级别时保持原始值 - 在值 = "yes" 的唯一一列中?或者我应该创建空数据框并分配级别然后分配值?谢谢!

我的具体用例是我有一些来自某处的值(预测值)。所以基本上是一行数据。然后我想做一个预测。不过,大多数 R 模型都需要设置级别。因此,我执行了上述操作但它更改了数据?!

PS:

我可以,但看起来很笨拙:

x_value <- "yes"
df <- data.frame(
                x = x_value
            )

levels(df$x) <- c("no", "yes")

df[1,]$x = x_value

PPS:

这可能是最短的代码 - 谢谢:

df <- data.frame(
    x = factor(x_value, levels = c("no", "yes"))
)
x_value <- factor("yes", levels = c("no", "yes"))
df <- data.frame(
    x = x_value
)

df

    x
1 yes

为什么问题中的示例显示此 "weird" 行为:

创建的数据框有一个一级因子。当你设置levels().

时,该层对应的数字是1,这就是关联的元素

这是一个简单的例子:

如果我们像这样创建一个数据框

x_value <- c("somethingElse", "more", "more")
df <- data.frame(
    x = x_value
)

df$x

向我们展示了级别

[1] somethingElse more          more         
Levels: more somethingElse

请注意,第一级是 "more",即使 "somethingElse" 先出现。这是因为排序后 "more" 排在第一位。 所以,如果我们现在分配

levels(df$x) <- c("yes", "somethingElse", "more")

第一个因子水平得到 "yes",第二个因子水平得到 "somethingElse",导致(可能不直观)

              x
1 somethingElse
2           yes
3           yes