下面是数据帧df1,我希望将因子格式的“V2”列转换为数字,而不更改当前值(0; 0; 8,5; 3)。
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不是整数的事实有关。我还是不知道如何解决这个问题。非常感谢帮助!
答案 0 :(得分:9)
尝试使用此替换数据中的逗号:
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转换为大约其原始数值,建议使用.numeric(levels(f))[f],并且比as.numeric(as.character(f))稍微更有效。
答案 1 :(得分:7)
用点代替逗号,代表R中的小数。否则R认为它是一个字符并将值强制转换为NA。
然后,提取值:
as.numeric(levels(df1[,2])[df[,2]])
(感谢@ SimonO101的更正)
答案 2 :(得分:0)
转换为字符后添加以下代码行:
df[3,2] <- 8.5
然后,您应该能够将字符转换为数字。由于R的默认小数点分隔符为.
而非,
,因此如果没有该步骤,则您的值将替换为NA。