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

R 因子强制为数据框中的*每*行生成一个数字标签,而不是指定的标签,r,r-factor,R,R Factor,我试图强制数据框中的数字列使用因子。强制可以正常工作,除了为数据帧的每一行获取一个数字标签,而不是我指定的标签。没有错误消息 我尝试过整洁和基本的方法;在强制为因子之前,将目标向量强制为字符(甚至整数);在tibble上运行相同的代码,而不是在数据帧上运行相同的代码,以防它与行名称有关。我已经在这里和互联网上其他与R相关的部分进行了搜索 我确信我在这里遗漏了一些明显的东西,但是当一个人看问题太久的时候,我就是看不到 df <- data.frame("a" = c(1,

我试图强制数据框中的数字列使用因子。强制可以正常工作,除了为数据帧的每一行获取一个数字标签,而不是我指定的标签。没有错误消息

我尝试过整洁和基本的方法;在强制为因子之前,将目标向量强制为字符(甚至整数);在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
df[1]“整数”
级别(df$a)
#>[1]“是”“否”
标签(df$a)#与df中的行数相同。添加行并显示更多标签。
#> [1] "1" "2" "3"
df$a
#>[1]是否否否
#>级别:是否

由reprex软件包(v0.3.0)于2020-09-24创建我们可以使用
dput查看
df$a的结构:

dput(df$a)
#>结构(c(1L,2L,2L),.Label=c(“是”,“否”),class=“因子”)
您可以看到,它确实是一个具有适当标签的因素。您正在使用的函数
labels
不会返回因子的
.Label
元素。它与各种因素完全无关,我想你只是被它的名字弄糊涂了。
labels
函数只给出一个数字字符向量,其长度与输入向量相同,而不管该类是什么。例如:

标签(5:10)
#> [1] "1" "2" "3" "4" "5" "6"
因此,您新创建的因子没有问题。
levels
函数返回因子的
.Label
分量时相当混乱

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

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
把原来的数字拿回来


但是,没有错误。你的强迫是正确的,并且完全按照你的意图运作。只有您了解标签功能的作用,才会导致问题。

r中的级别和标签可能会引起混淆,因为它们与其他一些系统不同。这可能有助于清除它。谢谢你。在我发布之前,我确实读过这篇文章;Joris Meys的回答很清楚,但它没有解决我的问题。谢谢你,艾伦。这使混乱的情况更加清楚。我想,计算机科学和命名可能有一个寓意。我已经将
dput()
添加到我的工具箱中,因此也感谢您。
factor(df$a, levels = "2", labels = "no")
#> [1] <NA> no   no  
#> Levels: no