我有一个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列转换为数字列?
答案 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=FALSE
或read.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而不是级别本身。