Data.table: fread kann möglicherweise keine gültige Datei analysieren, wenn dec = ','

Erstellt am 13. Apr. 2018  ·  3Kommentare  ·  Quelle: Rdatatable/data.table

> fread('a,b,c,d\n1e1,1e2,1e3,"4,0001"\n1,2,3,4\n', dec=',')
       a     b     c      d
   <num> <num> <num>  <num>
1:    10   100  1000 4.0001
Warning message:
In fread("a,b,c,d\n1e1,1e2,1e3,\"4,0001\"\n1,2,3,4\n", dec = ",") :
  Discarded single-line footer: <<1,2,3,4>>

Dies geschieht, weil der Float-Parser 1,2 gierig als einzelnes Token verbraucht, während er ohne Anführungszeichen als zwei separate Felder analysiert werden muss.

Darüber hinaus enthält der Abschnitt "Details" in der Dokumentation die folgenden Informationen (die längst veraltet sind):

'fread' verwendet die C-Funktion 'strtod', um numerische Daten zu lesen. z.B,
"1,23" oder "1,23". 'strtod' ruft das Dezimaltrennzeichen ('.' oder ab
',' normalerweise) aus dem Gebietsschema der R-Sitzung und nicht als
Argument an die Funktion 'strtod' übergeben. So für
'fread (..., dec = ",")' funktioniert, 'fread' ändert dies (und nur das)
Das Gebietsschema der R-Sitzung wird vorübergehend auf ein Gebietsschema verschoben, das die
gewünschtes Dezimaltrennzeichen.

bug fread

Alle 3 Kommentare

Super Paket! Vielen Dank.
Zufälligerweise habe ich gestern ein möglicherweise damit verbundenes seltsames Verhalten mit fread erlebt.
Hier ist ein einfaches Beispiel (abgeleitet aus einem realen Fall mit lapply fread für eine Reihe von Dateien).

library(data.table)

DT = data.table(A = rep("20,1", 1e4))
fwrite(DT, "DT.csv", quote = FALSE)

classA = character(1e3)

for (i in seq_along(classA)) {

  DT = fread("DT.csv", sep = ";", dec = ",", colClasses = "numeric")
  classA[i] = DT[, class(A)]
}

table(classA)

Das gibt mir:

Warning message:
In fread("DT.csv", sep = ";", dec = ",", colClasses = "numeric",  :
  Bumped column 1 to type character on data row 387, field contains '20,1'. Coercing previously read values in this column from logical, integer or numeric back to character which may not be lossless; e.g., if '00' and '000' occurred before they will now be just '0', and there may be inconsistencies with treatment of ',,' and ',NA,' too (if they occurred in this column before the bump). If this matters please rerun and set 'colClasses' to 'character' for this column. Please note that column type detection uses a sample of 1,000 rows (100 rows at 10 points) so hopefully this message should be very rare. If reporting to datatable-help, please rerun and include the output from verbose=TRUE.

table(classA)
# classA
# character   numeric 
#        1       999 
which(classA == "character")
# [1] 9
`````

So, sometimes, the column is read as character with the spotted row index being different for different runs. And the ```which``` indicates it is more likely to happen in the first iterations. I don't get the randomness and the fact that colClasses is ignored (I set colClasses after reading fread doc...).
And... I did not manage to reproduce the error when setting verbose = TRUE... Also, the bug was observed using RStudio, not reproduced in the R console...
Sorry if I missed or misunderstood something...

```r
sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.10.4-3

loaded via a namespace (and not attached):
[1] tools_3.3.2 yaml_2.1.18

Bitte stellen Sie sicher, dass Sie auf die Entwicklungsversion von data.table aktualisieren und erneut testen. Seit der letzten Veröffentlichung wurden viele Verbesserungen an fread

In der Tat ... lief das gleiche Beispiel ein paar Mal mit 1.10.5 und es funktionierte gut.
Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen