如何将data.frame列从因子转换为数字

时间:2014-12-17 15:22:04

标签: r

我有一个data.frame,其类列为Factor。我想将它转换为数字,以便我可以使用相关矩阵。

> str(breast)
'data.frame':   699 obs. of  10 variables:
 ....
 $ class                   : Factor w/ 2 levels "2","4": 1 1 1 1 1 2 1 1 1 1 ...
> table(breast$class)
  2   4 
458 241
> cor(breast)
Error in cor(breast) : 'x' must be numeric

如何将Factor列转换为数字列?

4 个答案:

答案 0 :(得分:77)

breast$class <- as.numeric(as.character(breast$class))

如果您有许多列要转换为numeric

indx <- sapply(breast, is.factor)
breast[indx] <- lapply(breast[indx], function(x) as.numeric(as.character(x)))

另一种选择是在使用stringsAsFactors=FALSEread.table

阅读文件时使用read.csv

以防万一,创建/更改列的其他选项

 breast[,'class'] <- as.numeric(as.character(breast[,'class']))

 breast <- transform(breast, class=as.numeric(as.character(breast)))

答案 1 :(得分:10)

来自?factor

  

要将因子f转换为大约其原始数值,建议使用as.numeric(levels(f))[f],效率略高于as.numeric(as.character(f))

答案 2 :(得分:6)

这是FAQ 7.10。其他人已经展示了如何将其应用于数据框中的单个列或数据框中的多个列。但这确实是治疗症状,而不是治愈原因。

更好的方法是使用colClasses参数read.table和相关函数告诉R该列应该是数字,以便它永远不会创建因子并创建数字。对于任何未转换为数字的值,这将放入NA

另一个更好的选择是找出为什么R不能将列识别为数字(通常是该列中某处的非数字字符)并修复原始数据以便正确读取它而无需创建{{1} }第

最好是最后2个的组合,在读取之前确保数据是正确的并指定NA所以R不需要猜测(这也可以加快阅读速度)。

答案 3 :(得分:1)

作为$dollarsign表示法的替代方法,请使用within块:

breast <- within(breast, {
  class <- as.numeric(as.character(class))
})

请注意,您希望在将矢量转换为数字之前将其转换为字符。简单地调用as.numeric(class)不会对应于每个因子级别(1,2)的ID而不是级别本身。