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

时间:2016-07-19 21:04:16

标签: r read.csv

更新

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

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)。有什么建议?

1 个答案:

答案 0 :(得分:1)

这是一个类似于你的解决方案。假设只有第一列是字符,其余列是您尝试转换的数字。我将所有列转换为数值,将“”,NaN和Null强制为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),]