4

下面是数据框 df1,我想在不更改当前值(0;0;8,5;3)的情况下将列“V2”从因子格式转换为数字。

df1=

             V1  V2 V3       X2 X3
4470 2010-03-28   0  A 21.53675  0
4471 2010-03-29   0  A 19.21611  0
4472 2010-03-30 8,5  A 21.54541  0
4473 2010-03-31   3  A       NA NA

由于列“V2”是因子格式,我首先将其转换为字符格式: df1[,2]=as.character(df1[,2])

然后我尝试将“V2”转换为数字格式:

df1[,2]=as.numeric(df1[,2])

导致此 R 消息:

Warning message: NAs introduced by coercion

并且下面的数据框df[3,2]已更改为“NA”而不是剩余的“8,5”..

             V1 V2 V3       X2 X3
4470 2010-03-28  0  A 21.53675  0
4471 2010-03-29  0  A 19.21611  0
4472 2010-03-30 NA  A 21.54541  0
4473 2010-03-31  3  A       NA NA 

这可能与 8,5 不是整数有关。我仍然不知道如何解决这个问题。帮助将不胜感激!

4

3 回答 3

10

试试这个来替换数据中的逗号:

fac<- c( "0" , "0" , "1,5" , "0" , "0" , "8" )
#[1] "0"   "0"   "1,5" "0"   "0"   "8" 
fac <- as.numeric( sub(",", ".", fac) )
#[1] 0.0 0.0 1.5 0.0 0.0 8.0

更普遍地将因子转换为其基础值而不是因子表示:

fac <- as.factor( fac )
as.numeric(fac)
#[1] 1 1 2 1 1 3
as.numeric(as.character(fac))
#[1] 0.0 0.0 1.5 0.0 0.0 8.0

但是,这是转换为原始值的规范方式

 as.numeric(levels(fac))[fac]

从帮助页面?as.factor

特别是,应用于因子的 as.numeric 是没有意义的,并且可能通过隐式强制发生。要将因子 f 转换为近似其原始数值,建议使用 as.numeric(levels(f))[f],并且比 as.numeric(as.character(f)) 稍微高效一些。

于 2013-05-02T10:19:21.890 回答
7

用点替换逗号,点表示 R 中的小数。否则 R 认为它是一个字符并将值强制为 NA。

然后,提取值:

as.numeric(levels(df1[,2])[df[,2]])

(感谢@SimonO101 的更正)

于 2013-05-02T10:20:06.063 回答
0

Add the following line of code after you converted to character:

df[3,2] <- 8.5

You should then be able to convert characters to numerics. Since R's default decimal separator is . and not ,, your value is replaced by NA without that step.

于 2013-05-02T10:22:25.137 回答