请解释我们如何将因子变量转换为 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 中的数字的主要内容,如果未能解决你的问题,请参考以下文章