2013-10-08 8 views
7

Kann fread aus" data.table "gezwungen werden, "." als sep Wert zu verwenden?Verwenden von sep = "." in `fread` von" data.table "

Ich versuche fread zu verwenden, um meine concat.split Funktionen in "splitstackshape" zu beschleunigen. Siehe this Gist für den allgemeinen Ansatz, den ich nehme, und this question für warum ich den Schalter machen möchte.

Das Problem, das ich in renne, behandelt einen Punkt (".") als Wert für sep. Immer wenn ich das mache, bekomme ich einen "unerwarteten Charakter" -Fehler.

Das folgende vereinfachte Beispiel veranschaulicht das Problem.

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 

Die Abhilfe, die ich in meiner jetzigen Funktion ist "." mit einem anderen Charakter zu ersetzen, die hoffentlich nicht in den ursprünglichen Daten sind, sagt "|", aber das scheint mich riskant, da kann ich nicht vorhersagen, was in ist jemandes Datensatz. Hier ist die Problemumgehung in Aktion.

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 

Für die Zwecke dieser Frage annehmen, dass die Daten ausgeglichen sind (jede Zeile die gleiche Anzahl von „sep“ Zeichen). Ich bin mir bewusst, dass die Verwendung einer "." als Trennzeichen nicht die beste Idee ist, aber ich versuche nur zu erklären, was andere Benutzer in ihren Datensätzen haben könnten, basierend auf otherquestionsI've answered hier auf SO.

+0

Ich habe nicht viel auf die Quelle für 'fread' geschaut, also nicht das Offensichtliche zu fragen, aber hast du versucht, das' \\. 'Zu entkommen? –

+0

@RicardoSaporta, ja. Sie erhalten einen Fehler: 'Fehler in fread (x1, sep =" \\. ", Header = FALSE): 'sep' muss 'auto' oder ein einzelnes Zeichen 'sein. – A5C1D2H2I1M1N2O1R2T1

+0

Das habe ich gerade nach meinem Kommentar bemerkt. hmmm ... ich habe keine Ahnung. Vielleicht kann @MattDowle reinhören? –

Antwort

3

Jetzt in v1.9.5 implementiert auf 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 

Einstellung sep='.' Ergebnisse in Zweideutigkeit mit dem neuen Argumente dec (standardmäßig '.'):

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

daher etwas anderes für dec wählen:

> 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 

Sie eine Warnung erhalten kann:

> 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. 

Entweder ignorieren oder die Warnung unterdrücken oder den Absatz lesen und die Option:

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

Dies stellt sicher, kann es keine Zweideutigkeit.

0

< dies ist ein langer Kommentar, keine Antwort>

Die Ausgabe Nähte an den numerischen Wert der Text selbst bezogen werden.

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 

jedoch mit dem ursprünglichen Wert versuchen, gibt wieder den gleichen Fehler

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 

Dies ist jedoch funktioniert:

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

Hmmm. Das ist interessant. Wenn wir 'y <- einfügen (" Hz.BB.GHG. ", 1:10, 11:20, sep =" ") hätten, würden wir wiederum einen Fehler bekommen. Irgendeine Idee warum? – A5C1D2H2I1M1N2O1R2T1

+0

In Bezug auf Ihre Bearbeitung ('read.table') verwende ich das zur Zeit in einer der Versionen von' concat.split'. Siehe 'splatstapshape ::: read.concat'. – A5C1D2H2I1M1N2O1R2T1

+1

Es ist fast 7 Uhr in London, ich weiß nicht, was Matt nicht im Stackoverflow ist;) Viel Glück damit, ich gehe ins Bett (ich werde diese Antwort am Morgen löschen) –

Verwandte Themen