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

时间:2020-02-07 10:44:34

标签: r categorical-data

我不明白这个逻辑:

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"))
)

1 个答案:

答案 0 :(得分:2)

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

df

    x
1 yes

为什么问题中的示例显示了这种“怪异”行为

创建的数据框具有一个因子。设置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