level(factorObject)[factorObject]如何生成完整的向量?

时间:2014-06-20 07:06:23

标签: r

vectorN = c("Hello","How","are","you","you","are","Hello")
factorVectorN = factor(vectorN) 
#Value of levels(factorVectorN) is c("are", "Hello", "How", "you")
all(levels(factorVectorN)[factorVectorN] == vectorN) # returns TRUE

请您解释一下,上面示例级别(factorVectorN)[factorVectorN] 如何创建与vectorN相同的向量?

2 个答案:

答案 0 :(得分:1)

levels(factorVectorN)是"字符"的原型向量。长度为3

class(levels(factorVectorN))
## [1] "character"
length(levels(factorVectorN))
## [1] 3

这意味着它有3个条目,您可以使用[]索引它们。

当您运行levels(factorVectorN)[factorVectorN]时,您基本上告诉R从levels(factorVectorN)中提取与名为factorVectorN

的索引向量相匹配的条目

现在,factorVectorN包含以下索引1 2 1 2 3 2。因此R将首先输入factorVectorN,然后是第二个输入,然后是第一个输入,然后是第二个,依此类推。哪个会返回1 2 1 2 3 2,因为这些是levels(factorVectorN)对应于指定索引向量的值

答案 1 :(得分:1)

这只是基本的子集。来自help("[")

  

允许按因子编制索引,相当于按索引编制索引   数字代码(见因子)而不是字符值   印刷

您已经显示了因子水平。在内部,因子只是一个整数向量,其中每个数字(从1开始)对应于因子级别:

str(factorVectorN)
#Factor w/ 4 levels "are","Hello",..: 2 3 1 4 4 1 2
as.integer(factorVectorN)
#[1] 2 3 1 4 4 1 2

因此,如果使用这些数字对级别进行子集化,则会得到一个与原始因子具有相同值的字符向量:

str(levels(factorVectorN)[factorVectorN])
#chr [1:7] "Hello" "How" "are" "you" "you" "are" "Hello"

如果您使用==将原始因子与字符向量进行比较,您的因素也会被强制转换为字符。