因子强制为数据框中的 *each* 行生成数字标签,而不是指定的标签

Factor coercion produces a numeric label for *each* row in data frame, not the labels specified

我正在尝试将数据框中的数字列强制转换为因子。强制转换正常,除了我指定的标签不是我指定的标签,而是为数据框的每一行获取一个数字标签。没有错误消息。

我尝试过 tidyverse 和 base 方法;在强制转换为因子之前将目标向量强制转换为字符(甚至整数); 运行 在 tibble 而不是数据框上使用相同的代码,以防万一它与行名称有关。我在这里和互联网上其他与 R 相关的部分进行了搜索。

我确信我在这里遗漏了一些明显的东西,但是当一个人看一个问题太久时,我就是看不到它。

df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL, stringsAsFactors = FALSE)

df$a <- factor(df$a, levels = c("1", "2"), labels = c("yes", "no"))

# coercion to factor worked:
class(df$a)
#> [1] "factor"
typeof(df$a)
#> [1] "integer"

levels(df$a)
#> [1] "yes" "no"
labels(df$a)  # same as no. rows in df. Add rows and more labels appear.
#> [1] "1" "2" "3"
df$a
#> [1] yes no  no 
#> Levels: yes no

由 reprex 包 (v0.3.0) 创建于 2020-09-24

我们可以使用 dput:

查看 df$a 的结构
dput(df$a)
#> structure(c(1L, 2L, 2L), .Label = c("yes", "no"), class = "factor")

可以看到确实是一个标签合适的因素。您正在使用的函数 labels 没有 return 因子的 .Label 元素。它与因素完全无关,我想你只是被名字弄糊涂了。 labels 函数只是给出一个与输入向量长度相同的数字字符向量,无论 class 是什么。例如:

labels(5:10)
#> [1] "1" "2" "3" "4" "5" "6"

所以你新创建的因子没有问题。 levels 函数相当混乱 return 是因子的 .Label 分量。

因素实际上并没有名为“级别”的命名组件。函数 factor 中的 levels 参数有时仅在从字符或数字向量创建因子时使用,以便我们指定我们感兴趣的向量元素。在您的情况下, [= factor 调用的 20=] 参数是完全多余的:

df <- data.frame("a" = c(1, 2, 2), "b" = c(2, 1, 1), row.names = NULL)
factor(df$a, labels = c("yes", "no"))
#> [1] yes no  no 
#> Levels: yes no

我们只会在想要降低一些关卡时使用它:

factor(df$a, levels = "2", labels = "no")
#> [1] <NA> no   no  
#> Levels: no

我想您可能一直在寻找:

as.numeric(df$a)
#> [1] 1 2 2

恢复原来的数字。

但是,没有错误。您的强制是正确的,并且完全按预期工作。只有您对 labels 函数应该做什么的理解才会导致问题。