7

「 data.table fread」から強制的に値"."として正常に使用できsepますか?

「splitstackshape」で関数freadを高速化するために使用しようとしています。私が採用している一般的なアプローチについては、この Gistを参照してください。切り替えを行う理由については、この質問を参照してください。concat.split

私が直面している問題は、ドット ( ".") を の値として扱うことですsep。そうするたびに、「予期しない文字」エラーが発生します。

次の単純化された例は、問題を示しています。

library(data.table)

y <- paste("192.168.1.", 1:10, sep = "")

x1 <- tempfile()
writeLines(y, x1)
fread(x1, sep = ".", header = FALSE)
# Error in fread(x1, sep = ".", header = FALSE) : Unexpected character (
# 192) ending field 2 of line 1

現在の関数で使用している回避策は"."、元のデータには存在しないことが望ましい別の文字、たとえば"|"で置き換えることですが、他の誰かのデータセットに何があるかを予測できないため、危険に思えます。これが実際の回避策です。

x2 <- tempfile()
z <- gsub(".", "|", y, fixed=TRUE)
writeLines(z, x2)
fread(x2, sep = "|", header = FALSE)
#      V1  V2 V3 V4
#  1: 192 168  1  1
#  2: 192 168  1  2
#  3: 192 168  1  3
#  4: 192 168  1  4
#  5: 192 168  1  5
#  6: 192 168  1  6
#  7: 192 168  1  7
#  8: 192 168  1  8
#  9: 192 168  1  9
# 10: 192 168  1 10

この質問では、データのバランスが取れていると仮定します (各行には同じ数の " sep" 文字が含まれます)。セパレーターとして aを使用することは最善のアイデアではないことは承知していますが、ここ SO で回答した他の質問"."に基づいて、他のユーザーがデータセットに持っている可能性があるものを説明しようとしています。

4

2 に答える 2

3

GitHub の v1.9.5 で実装されました。

> input = paste( paste("192.168.1.", 1:5, sep=""), collapse="\n")
> cat(input,"\n")
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5 

設定sep='.'すると、新しい引数があいまいになりますdec(デフォルトでは'.') :

> fread(input,sep=".")
Error in fread(input, sep = ".") : 
  The two arguments to fread 'dec' and 'sep' are equal ('.')

したがって、 には別のものを選択してdecください:

> fread(input,sep=".",dec=",")
    V1  V2 V3 V4
1: 192 168  1  1
2: 192 168  1  2
3: 192 168  1  3
4: 192 168  1  4
5: 192 168  1  5

警告が表示される場合があります:

> fread(input,sep=".",dec=",")
     V1  V2 V3 V4
 1: 192 168  1  1
 2: 192 168  1  2
 3: 192 168  1  3
 4: 192 168  1  4
 5: 192 168  1  5
Warning message:
In fread(input, sep = ".", dec = ",") :
  Run again with verbose=TRUE to inspect... Unable to change to a locale
  which provides the desired dec. You will need to add a valid locale name
  to getOption("datatable.fread.dec.locale"). See the paragraph in ?fread.

警告を無視または抑制するか、段落を読んでオプションを設定します。

options(datatable.fread.dec.locale = "fr_FR.utf8")

これにより、あいまいさがなくなります。

于 2014-11-12T21:22:04.500 に答える
0

この問題は、テキスト自体の数値に関連していると考えられます。

library(data.table)

y <- paste("Hz.BB.GHG.", 1:10, sep = "")

xChar <- tempfile()
writeLines(y, xChar)
fread(xChar, sep = ".", header = FALSE)
#     V1 V2  V3 V4
#  1: Hz BB GHG  1
#  2: Hz BB GHG  2
#  3: Hz BB GHG  3
#  4: Hz BB GHG  4
#  5: Hz BB GHG  5
#  6: Hz BB GHG  6
#  7: Hz BB GHG  7
#  8: Hz BB GHG  8
#  9: Hz BB GHG  9
# 10: Hz BB GHG 10

ただし、元の値を試してみると、同じエラーが発生します。

fread(x1, sep = ".", header = FALSE, colClasses="numeric", verbose=TRUE)
fread(x1, sep = ".", header = FALSE, colClasses="character", verbose=TRUE)

 Detected eol as \n only (no \r afterwards), the UNIX and Mac standard.
 Looking for supplied sep '.' on line 10 (the last non blank line in the first 'autostart') ... found ok
 Found 4 columns
 First row with 4 fields occurs on line 1 (either column names or first row of data)
 Error in fread(x1, sep = ".", header = FALSE, colClasses = "character",  : 
   Unexpected character (192.) ending field 2 of line 1

ただし、これは機能します。

read.table(x1, sep=".")
#     V1  V2 V3 V4
# 1  192 168  1  1
# 2  192 168  1  2
# 3  192 168  1  3
# 4  192 168  1  4
# ... <cropped>
于 2013-10-08T05:21:08.720 に答える