2016-07-19 3 views
1

UPDATEread.csv wandelt numerisch Zeichen/Faktor, wenn Werte zu viele signifikante Stellen haben

Wenn eine csv mit read.csv Lesen, benötige ich numerische Spalten mit NA, "", NaN und NULL in gelesen werden a data.frame als numerisch. Das Problem besteht darin, dass einige dieser Fälle in Zeichen umgewandelt werden. Außerdem muss ich jede Zeile entfernen, die keine vollständigen Fälle enthält.
Beispiel Datensatz:

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" 

Danke für die bisherigen Antworten, aber es scheint die Wurzel des Problems ist die Anzahl der signifikanten Stellen nach dem (siehe valc oben) dem Komma ist. Irgendwelche Vorschläge?

+3

Hinzufügen 'quote =‚\‘‘, na.strings = c ('NA', 'NaN', 'NULL'), strip.white = TRUE' zu deiner Liste in read.csv Arbeit? – rawr

+0

@rawr sehen Sie bitte das Update: Es scheint die wahre Wurzel des Problems war, dass die numerische Eingabe eine große Anzahl von signifikanten Ziffern hatte, die auch in Zeichen umgewandelt wird. – N8TRO

Antwort

1

Hier ist eine Lösung ähnlich wie Ihre. Angenommen, nur die erste Spalte enthält Zeichen und die übrigen Spalten Zahlen, die Sie zu konvertieren versuchen. Ich konvertiert alle Spalten auf numerische Werte, die die „“, NaN und Nulls zu NA gezwungen, die leicht mit der complete.cases Funktion entfernt wird:

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),] 
+0

+1 Danke für die Antwort, aber ich habe die Frage aktualisiert, nachdem die Wurzel des Problems nicht die leeren oder leeren Felder gefunden hatte, sondern die Länge der numerischen Eingabe. – N8TRO

+0

Ok, aber selbst mit Ihren überarbeiteten Daten sollte der obige Code immer noch funktionieren, wenn Sie die leichte Fließkomma-Rundung nicht stören. – Dave2e

+0

Mindestens ein Problem, das ich sehe: jede Spalte könnte eine Zeichenspalte oder eine numerische Spalte sein. Keine spezifische Bestellung. – N8TRO

Verwandte Themen