请解释我们如何将因子变量转换为 R 中的数字

Posted

技术标签:

【中文标题】请解释我们如何将因子变量转换为 R 中的数字【英文标题】:Please explain working of how are we converting factor variable to numeric in R 【发布时间】:2019-04-16 16:21:18 【问题描述】:

谁能解释一下 as.numeric(levels(x))[x] 究竟是如何工作的? 这里 x 是一个因子变量。(例如 x ) 据我所知,首先我们得到 x 的级别(这将是字符,然后我们将其更改为数字。之后发生的事情我无法得到。我知道这种表示是相同的as as.numeric(as.character(x))

【问题讨论】:

第一个答案here看了吗? ...那么它只是使用x 值作为位置来获取相应的级别,以数字形式。你可以以as.numeric(levels(x))[c(1,1,2)] 为例,这意味着给我1st、1st(再次)和2nd 级别。如果您尝试要求不存在的东西,它将返回 NA 就像这样 as.numeric(levels(x))[c(1,1,2,6)] @DeNovo 是的,我看到了那个帖子,但我认为这是关于如何执行转换,而不是关于它到底是如何发生的。 @AntoniosK 明白了。谢谢。 【参考方案1】:

我总是对 R 的因子感到困惑。通常,我使用 package Rfast 中的一个完美想法,函数 Rfast::ufactor。它使用其初始类型表示一个因子。

这是一个例子:

x <- rnorm(10)
fx<- Rfast::ufactor(x)
fx$levels # you can get the levels like this
fx$values # you can get the values like this

快速简单。 Rfast::ufactor 比 R 快得多,但我不会发布任何基准,因为它不适合这个问题。

【讨论】:

【参考方案2】:

R 因子是整数向量,用作级别字符向量的索引。所以该表达式的内部部分是创建一个字符向量。外部部分是将一组值:“5”、“2”、“4”....等转换为数值。

> x<-as.factor(sample(1:5,20,replace=TRUE)) 

因子对象的存储类为整数:

> dput (x)
structure(c(4L, 2L, 3L, 4L, 5L, 2L, 2L, 2L, 1L, 2L, 4L, 2L, 1L, 
5L, 5L, 4L, 1L, 5L, 1L, 5L), .Label = c("1", "2", "3", "4", "5"
), class = "factor")

levels() 函数返回因子的.Label 属性,当因子用作索引时,它被作为整数处理:

> levels(x)[x]
 [1] "4" "2" "3" "4" "5" "2" "2" "2" "1" "2" "4" "2" "1" "5" "5" "4" "1" "5" "1" "5"

这种转换或提取方法比as.character(x) 稍快一些,但正如您所经历的,如果您还没有了解“幕后”(或“引擎盖”如果这就是你在英语世界中的称呼。)

【讨论】:

以上是关于请解释我们如何将因子变量转换为 R 中的数字的主要内容,如果未能解决你的问题,请参考以下文章

将多个分类变量转换为R中的因子

将因子级别转换为R中的数字

将因子变量分钟:秒转换为R中的数值变量分钟.秒

R语言笔记——将因子转换为整数

如何将具有离散值范围的数值向量转换为因子?

bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字