有人可以解释一下as.numeric(levels(x))[x]究竟是如何工作的吗?这里 x 是一个因子变量。(例如x<-as.factor(sample(1:5,20,replace=TRUE)))据我所知,首先我们得到 x 的水平(之后我们将其更改为数字将是字符。之后发生的事情我无法得到。我知道这种表示与as.numeric(as.character(x))相同。
2 回答
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),但正如您所经历的那样,如果您没有处理“引擎盖下”发生的事情(或“引擎盖”,如果这就是它在您的英语世界的一部分。)
于 2018-11-13T18:57:50.717 回答
2
我总是对 R 的因素感到困惑。通常,我使用Rfast包中的一个完美想法,即 function 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 快得多,但我不会发布任何基准,因为它不适合这个问题。
于 2018-11-16T20:02:46.677 回答