如何将因子转换为浮点而不会损失R中的精度?

时间:2014-06-12 14:57:29

标签: r

这就是我所拥有的:

tmp[1,]

percentages      percentages.1      percentages.2      percentages.3      percentages.4 percentages.5      percentages.6      percentages.7      percentages.8      percentages.9
0.0329489291598023 0.0391268533772652 0.0292421746293245 0.0354200988467875 0.0284184514003295 0.035831960461285 0.0308896210873147 0.0345963756177924 0.0366556836902801 0.0403624382207578

我尝试将其转换为数字,因为该类为factor,但我得到:

as.numeric(as.character(tmp[1,]))
[1] 35 36 35 36 31 32 31 34 36 34

这些整数来自哪里?

2 个答案:

答案 0 :(得分:4)

您的问题是,通过数据框的进行索引会产生令人惊讶的结果。

重建你的对象:

tmp <- read.csv(text=
     "0.0329489291598023,0.0391268533772652,0.0292421746293245,0.0354200988467875,0.0284184514003295,0.035831960461285,0.0308896210873147,0.0345963756177924,0.0366556836902801,0.0403624382207578",
header=FALSE,colClasses=rep("factor",10))

检查:

str(tmp[1,])
## 'data.frame':    1 obs. of  10 variables:
##  $ V1 : Factor w/ 1 level "0.0329489291598023": 1
##  $ V2 : Factor w/ 1 level "0.0391268533772652": 1
## ... etc.

通过as.character()转换完全搞砸了事情:

str(as.character(tmp[1,]))
##  chr [1:10] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"

另一方面,这(首先转换为矩阵)工作正常:

as.numeric(as.matrix(tmp)[1,])
##  [1] 0.03294893 0.03912685 0.02924217 0.03542010 0.02841845 0.03583196
##  [7] 0.03088962 0.03459638 0.03665568 0.04036244

那就是说,我必须承认我不理解使as.character()应用于数据框的特殊魔法丢弃了有关因子级别的信息并将所有内容首先转换为基础数字代码,然后是字符 - 我不知道你会在哪里读到这个。 (底线是“如果可以提供帮助,请不要提取数据帧行;如有必要,请先将它们转换为矩阵。”)

答案 1 :(得分:2)

作为转换为矩阵的替代方法,您只需将数据框行转置为列:

    as.numeric(as.character(t(tmp[1,])))
## [1] 0.03294893 0.03912685 0.02924217 0.03542010 0.02841845 0.03583196
## [7] 0.03088962 0.03459638 0.03665568 0.04036244

我认为OP看到的整数

[1] 35 36 35 36 31 32 31 34 36 34

是因子级别,他的数据框有多行--36行或更多 - 这些是第一行的级别。

ETA我看到t()将数据帧转换为矩阵,因此我的解决方案与Ben的解决方案相同。

可能as.character()不适用于数据帧行的原因是不同列的级别可能不同,因此没有一组共同的levels()。在这些情况下as.matrix()将转换为字符,因此它解决了问题。