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

问题描述

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

我已经尝试过tidyverse和基本方法;在强制分解之前,将目标向量强制转换为字符(甚至整数);以小标题而不是数据帧的方式运行相同的代码,以防万一与行名有关。我已经在这里和互联网上其他与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

解决方法

我们可以使用df$a查看dput的结构:

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

您可以看到,使用适当的标签确实是一个因素。您使用的函数labels不会返回因子的.Label元素。它与因素完全无关,我想您只是对名称感到困惑。 labels函数仅给出数字的字符向量,其长度与输入向量的长度相同,无论该类是什么。例如:

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

因此,新创建的因子没有错。 levels函数会令人困惑地返回因子的.Label分量。

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

factor

我们仅在要降低某些级别时才使用它:

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 函数应该做什么的理解会导致问题。