数字转换R中的as.factor()

时间:2018-03-28 23:34:27

标签: r type-conversion

所以我现在正在学习R,并且我从许多来源注意到,每当我们想要将数据类型转换为数字时,我们都使用两个函数as.numeric()as.factor()

例如,如果我想将列Year转换为数字,则它将是

as.numeric(as.factor(survey.data$Year))

我尝试单独使用as.numeric(),它也很完美。但是我觉得我有这样的错过了。我只是想知道首先转换为Factor,然后转换为Numeric的原因是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

如果要将“年份”列转换为数字,也许您想到的是将因子转换为数字的必要过程,首先必须将其转换为字符。

您可以对数据框进行操作,并对该列进行子集设置,但是在这里我要创建一个简单的示例:

#Create a factor vector called Year with 3 levels
    Year <- factor(c(2001, 2001, 2001, 2004, 2004, 2020, 2020))
    Year
    [1] 2001 2001 2001 2004 2004 2020 2020
    Levels: 2001 2004 2020 

如果您尝试从一个因子直接转换为数字,则会看到一个数字矢量,但会看到每个值匹配的级别,而不是原始值。例如,第一级2001Year中的前三个值匹配,因此您将1 1 1视为数字矢量中的前三个值:

#Incorrect: convert Year into numeric directly
    nope.Year <- as.numeric(Year)
    nope.Year
    [1] 1 1 1 2 2 3 3

要正确地将因子转换为数字并真正返回原始向量值,请先转换为字符,然后转换为数字,然后使用嵌套函数执行此操作,因为R从最里面的括号开始并且有效向外按操作顺序:

#Correct: convert Year into a character, then into numeric
    num.Year <- as.numeric(as.character(Year))
    num.Year
    [1] 2001 2001 2001 2004 2004 2020 2020

值得注意的是,如果您使用的是R的旧版本(4.0之前的版本),那么当您使用data.frame()read.table()变体时,R默认将您的字符串转换为因子,除非您在每个函数中指定参数stringsAsFactors = FALSE。如果未指定stringsAsFactors = FALSE,则必须完成将因子转换为字符然后转换为数字的过程。

如果您正在使用R的后续版本(4.0或更高版本),那么当您使用这些函数或其变体时,R不再自动将字符串转换为因数,因为现在默认参数为stringsAsFactors = FALSE,并且我们都可以庆祝。

答案 1 :(得分:0)

我不认为你在这里遗漏任何东西。要理解的主要内容是R如何转换数据类型,三种常见的数据类型为numericcharacterfactor。迄今为止(在我看来)因素来自其他语言的因素最不直观。

我喜欢将其视为“类别”的因素。他们没有订单(不同于可以按字母顺序排序的字符)。它们是用于列出内容的抽象数据类型。其他人可能不同意这种解释,但这有助于我理解。

我说因素没有秩序,这简直就是谎言。事实证明,因素也有levels。级别列出了事物的顺序。假设我们有一个向量

animals <- factor(c("Rabbit", "Cat", "Dog"))

如果我们使用levels(animals)检查其级别,则会按该顺序返回"Cat" "Dog" "Rabbit"。这是因为我们将矢量创建为字符,因此默认的“级别顺序”是按字母顺序排列的。

我们可以通过以下方式更改这些级别订单,但如果您希望Rabbit成为第一级,则需要手动设置。这意味着您可以为这些抽象变量创建顺序。

如果我们使用

as.numeric(animals)

这将导致c(3, 1, 2)。这是因为数字将因子转换为表示其级别顺序的整数。

如果你想转换一个因子,对数字1说“1”,你必须先将它转换为一个字符,然后再转换为数字。

这是因为因子和整数之间的转换具有此行为。但是从因子到角色的转换剥掉了构成因子的字母。然后从字符转换为数字将数字字符转换为实际数字。

所以回到你的例子,我认为只使用as.numeric就好了,除非你想得到代表因子水平顺序的数字。