2016-03-19 7 views
1

Ich lese Dateien mit fread(). Bei einigen Dateien habe ich die folgende Situation:Datenverlust bei `fread()` aufgrund von NA auf Zeichen

dt1 <- fread('colA colB colC 
      A01 NA NA 
      A02 NA NA 
      A03 NA NA 
      A04 NA NA 
      A05 NA NA 
      A06 NA NA 
      A07 bbb NA 
      A08 NA ccc 
      A09 NA NA 
      A10 NA NA 
      A11 NA NA 
      A12 NA NA 
      A13 NA NA 
      A14 NA NA 
      A15 NA NA 
      A16 NA NA 
      A17 NA NA 
      A18 NA NA 
      ') 

Bumped column 2 to type character on data row 7, field contains 'bbb'. 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 the first 5 rows, the middle 5 rows and the last 5 rows, so hopefully this message should be very rare. If reporting to datatable-help, please rerun and include the output from verbose=TRUE.

dt1 
#  colA colB colC 
# 1: A01  NA 
# 2: A02  NA 
# 3: A03  NA 
# 4: A04  NA 
# 5: A05  NA 
# 6: A06  NA 
# 7: A07 bbb NA 
# 8: A08 NA ccc 
# 9: A09 NA NA 
# 10: A10 NA NA 

In den resultierenden data.table, colB Werte vor dem ersten Zeichen Vorkommen sind leere Strings statt NA. Ich kenne Spaltennamen oder Spaltennummern nicht im Voraus, daher kann ich das Argument colClasses nicht verwenden. Gibt es eine Möglichkeit, dies zu lösen (neben der Verwendung von read.table() anstelle von fread())?

+0

Verwenden Sie keine Angebotsformatierung für Text, der nicht zitiert wird. – EJP

+0

@EJP, betrachtete ich dies als ein Zitat der Fehlermeldung - Was ist die korrekte Formatierung für diesen Fall? ohne Formatierung sieht es wie mein eigener Text aus, der es weniger klar macht –

+0

Ich setze Codeformatierung dann (sehe noch nicht, was das Problem der Zitatformatierung war - es sah besser aus, imho) –

Antwort

3

Gegeben Kommentare zu meiner ersten Antwort:

fread(DT, colClasses="character") 

alle Spalten als Zeichen gelesen werden. Standard R Recyling eines Singleton. In diesem Fall ist es nicht bekannt, welche Spalten (entweder nach Name oder nach Nummer) dieses Problem haben, so dass das Lesen von all als Zeichen akzeptabel ist.

+0

ja, löst meinen speziellen Fall, aber im Allgemeinen fügt später mehr Ärger mit numerischen Feldern hinzu, so wäre es toll, wenn dieses Problem in einigen zukünftigen Versionen irgendwie behoben werden könnte. Vielen Dank! –

+2

@VasilyA Klar, ich werde darüber nachdenken. Wir sind gerne reaktionsfähiger und zugänglicher als jeder Anbieter von geschlossenen Quellen. Und Sie können die Änderung selbst vornehmen, wenn Sie wollen, sofort ohne Einschränkung. Obwohl RStudio und Hadley sich dazu entschieden haben, nicht dazu beizutragen, sich zu freuden und die Anstrengung zu teilen. –

+1

Ich schätze diese Einstellung sehr, fühle mich immer dankbar für das tolle Paket und deine Datencamp-Kurse. –

1

Sie können Pass Spalte Zahlen zu colClasses.

Siehe die umfangreichen Beispiele am unteren Rand des ?fread dokumentiert:

# colClasses 
data = "A,B,C,D\n1,3,5,7\n2,4,6,8\n" 
fread(data, colClasses=c(B="character",C="character",D="character")) # as read.csv 
fread(data, colClasses=list(character=c("B","C","D"))) # saves typing 
fread(data, colClasses=list(character=2:4))  # same using column numbers 

# drop 
fread(data, colClasses=c("B"="NULL","C"="NULL")) # as read.csv 
fread(data, colClasses=list(NULL=c("B","C")))  # 
fread(data, drop=c("B","C"))  # same but less typing, easier to read 
fread(data, drop=2:3)    # same using column numbers 

# select 
# (in read.csv you need to work out which to drop) 
fread(data, select=c("A","D")) # less typing, easier to read 
fread(data, select=c(1,4))  # same using column numbers 
+1

sorry, ich war beim Schreiben nicht klar I weiß nicht Spalte Zahlen entweder –

+0

@VasilyA +1 LOL –

+0

@VasilyA Nun, traurig für mich, ich muss dann 'readr' vorschlagen. Vielleicht funktioniert das für dich? –

Verwandte Themen