当值有太多有效数字时,read.csv 将数字转换为字符/因子

Posted

技术标签:

【中文标题】当值有太多有效数字时,read.csv 将数字转换为字符/因子【英文标题】:read.csv converts numeric to character/factor when values have too many significant digits 【发布时间】:2016-07-19 21:04:15 【问题描述】:

更新

读取带有read.csv 的csv 时,我需要将带有NA""NaNNULL 的数字列作为数字读入data.frame。问题是其中一些案例被转换为字符。此外,我需要删除任何没有完整案例的行。 示例数据集:

df1 <- read.csv(text="
+ cat ,vala , valb, valc, vald, vale
+ only_valid_row, 1, 1.00000000000002e3, 1.99999999999999999e-2, 2e3, 3
+ a   , ''  , 12  , 13  , 2.1 , 10
+ b   , 2e-3, NA  , 1.1 , 1.11, 8
+ c   , 3e2 , 2.1 , NaN , 3   , 7.1
+ d   , 2   , 1e2 , 0.3 ,     , 0.1
+ e   , 3   , 1e2 , 3.14, 6   , NULL
+ ", stringsAsFactors=FALSE,na.strings=c('NA','NaN','NULL'),quote='\'',strip.white=TRUE)

sapply(df1,class)
        cat        vala        valb        valc        vald        vale 
#"character"   "numeric"   "numeric" "character"   "numeric"   "numeric" 
(df2 <- df1[complete.cases(df1),])
             cat vala valb                   valc vald vale
#1 only_valid_row    1 1000 1.99999999999999999e-2 2000    3
sapply(df2,class)
#        cat        vala        valb        valc        vald        vale 
#"character"   "numeric"   "numeric" "character"   "numeric"   "numeric" 

感谢之前的回答,但问题的根源似乎是小数点后的有效位数(参见上面的valc)。有什么建议么?

【问题讨论】:

quote = '\'', na.strings = c('NA','NaN','NULL'), strip.white = TRUE 添加到您在 read.csv 工作中的列表中? @rawr 请查看更新:看来我遇到问题的真正根源是数字输入有大量有效数字,这些数字也被转换为字符。 【参考方案1】:

这是一个类似于您的解决方案。假设只有第一列是字符,其余列是您要转换的数字。我将所有列转换为数值,强制将“”、NaN 和 Nulls 转换为 NA,使用 complete.cases 函数可以轻松删除:

df1 <- read.csv(text="
cat ,vala , valb, valc, vald, vale
                only_valid_row, 1, 1e3, 2, 2e3, 3
                a   , ''  , 12  , 13  , 2.1 , 10
                b   , 2e-3, NA  , 1.1 , 1.11, 8
                c   , 3e2 , 2.1 , NaN , 3   , 7.1
                d   , 2   , 1e2 , 0.3 ,     , 0.1
                e   , 3   , 1e2 , 3.14, 6   , NULL
                ", stringsAsFactors=FALSE)

#convert to numeruic and construct new dataframe
converted<-apply(df1[,-1], 2, function(x) as.numeric(as.character(x)))
newdf<-data.frame(df1[1], converted)
#return complete cases
newdf<-newdf[complete.cases(newdf),]

【讨论】:

+1 感谢您的回答,但我发现问题的根源不是空字段或空字段后更新了问题,而是数字输入的长度。 好的,但是即使使用您修改后的数据,如果您不介意轻微的浮点舍入,上面的代码应该仍然有效。 我看到至少一个问题:任何列都可以是字符列或数字列。没有具体的顺序。

以上是关于当值有太多有效数字时,read.csv 将数字转换为字符/因子的主要内容,如果未能解决你的问题,请参考以下文章

Django Models Decimal quantize 结果对于当前上下文有太多数字

一个 If 语句,用于查找数字字段是不是留空或有太多小数位,但如果小数位只有零则忽略

当值为数字时,如何将纬度和十进制分钟重新计算为十进制度?

将字符串转换为数字[重复]

在 R 中导入; (read.csv) 自动忽略非数字列

当值是数字时不显示 mat-select 值