2013-10-08 88 views
7

fread可以從「data.table」中強制成功使用"."作爲sep的值嗎?使用sep =「。」 「fread」from「data.table」

我試圖使用fread來加快我在"splitstackshape"中的concat.split函數。關於我正在採取的一般方法,請參閱this Gist,爲什麼我要進行切換,請參閱this question

我遇到的問題是將點(".")當作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」字符)。我知道使用"."作爲分隔符並不是最好的想法,但我只是試圖說明其他用戶在其數據集中可能具有的內容,基於SO上的otherquestionsI've answered

+0

我沒有看過'fread'的源碼,所以不要問明顯,但你有沒有試過逃避'\\。'? –

+0

@RicardoSaporta,是的。你會得到一個錯誤:'fread錯誤(x1,sep =「\\。」,header = FALSE):'sep'必須是'auto'或單個字符。 – A5C1D2H2I1M1N2O1R2T1

+0

我剛剛注意到我的評論後。嗯...我不知道。也許@MattDowle可以插入? –

回答

3

現在v1.9.5實現上GitHub上。

> 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") 

這確保不能有任何含糊。

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> 
+0

嗯。這很有趣。通過擴展,如果我們有'y < - paste(「Hz.BB.GHG。」,1:10,11:20,sep =「」)',我們又會得到一個錯誤。任何想法爲什麼? – A5C1D2H2I1M1N2O1R2T1

+0

關於你的編輯('read.table'),這就是我目前在'concat.split'的一個版本中使用的編輯。請參閱'splitstackshape ::: read.concat'。 – A5C1D2H2I1M1N2O1R2T1

+1

在倫敦差不多早上7點,我不知道馬特在做什麼,不在計算器上;)祝你好運,我準備睡覺(我會在早上刪除這個答案) –