Data.table: dec = '、'の場合、freadは有効なファイルの解析に失敗する可能性があります

作成日 2018年04月13日  ·  3コメント  ·  ソース: 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>>

これは、floatパーサーが1,2を単一のトークンとして貪欲に消費するのに対し、引用符がない場合は2つの別個のフィールドとして解析する必要があるために発生します。

さらに、ドキュメントの「詳細」セクションには、次の情報があります(古くなってからかなり経っています)。

'fread'はC関数 'strtod'を使用して数値データを読み取ります。 例えば、
「1.23」または「1,23」。 'strtod'は小数点記号( '。'または
'、'通常)としてではなく、Rセッションのロケールから
'strtod'関数に渡される引数。 だから
'fread(...、dec = "、")'が機能し、 'fread'がこれを変更します(これのみ)
Rセッションのロケールを一時的に提供するロケールに
必要な小数点記号。

bug fread

全てのコメント3件

素晴らしいパッケージ! ありがとうございました。
偶然にも、私は昨日、恐らく関連する奇妙な行動を恐怖と経験しました。
これは簡単な例です(一連のファイルでlapply freadを使用した実際のケースから派生)。

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)

これは私に与えます:

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

必ずdata.tableの開発バージョンに更新して、もう一度テストしてください。 前回のリリース以降、 freadは多くの改善が加えられています。

確かに... 1.10.5で同じ例を数回実行したところ、問題なく動作しました。
ありがとうございました。

このページは役に立ちましたか?
0 / 5 - 0 評価