当值有太多有效数字时,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
、""
、NaN
和NULL
的数字列作为数字读入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 结果对于当前上下文有太多数字