所以我现在正在学习R,并且我从许多来源注意到,每当我们想要将数据类型转换为数字时,我们都使用两个函数as.numeric()
和as.factor()
。
例如,如果我想将列Year转换为数字,则它将是
as.numeric(as.factor(survey.data$Year))
我尝试单独使用as.numeric()
,它也很完美。但是我觉得我有这样的错过了。我只是想知道首先转换为Factor,然后转换为Numeric的原因是什么?
感谢。
答案 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
如果您尝试从一个因子直接转换为数字,则会看到一个数字矢量,但会看到每个值匹配的级别,而不是原始值。例如,第一级2001
与Year
中的前三个值匹配,因此您将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如何转换数据类型,三种常见的数据类型为numeric
,character
和factor
。迄今为止(在我看来)因素来自其他语言的因素最不直观。
我喜欢将其视为“类别”的因素。他们没有订单(不同于可以按字母顺序排序的字符)。它们是用于列出内容的抽象数据类型。其他人可能不同意这种解释,但这有助于我理解。
我说因素没有秩序,这简直就是谎言。事实证明,因素也有levels
。级别列出了事物的顺序。假设我们有一个向量
animals <- factor(c("Rabbit", "Cat", "Dog"))
如果我们使用levels(animals)
检查其级别,则会按该顺序返回"Cat" "Dog" "Rabbit"
。这是因为我们将矢量创建为字符,因此默认的“级别顺序”是按字母顺序排列的。
我们可以通过以下方式更改这些级别订单,但如果您希望Rabbit成为第一级,则需要手动设置。这意味着您可以为这些抽象变量创建顺序。
如果我们使用
as.numeric(animals)
这将导致c(3, 1, 2)
。这是因为数字将因子转换为表示其级别顺序的整数。
如果你想转换一个因子,对数字1说“1”,你必须先将它转换为一个字符,然后再转换为数字。
这是因为因子和整数之间的转换具有此行为。但是从因子到角色的转换剥掉了构成因子的字母。然后从字符转换为数字将数字字符转换为实际数字。
所以回到你的例子,我认为只使用as.numeric
就好了,除非你想得到代表因子水平顺序的数字。