2013-06-06 5 views
7

Ich habe eine CSV-Datei, deren Spaltennamen Leerzeichen und Sonderzeichen enthalten.Befrage ich aus dem data.table-Paket, wenn Spaltennamen Leerzeichen und Sonderzeichen enthalten?

fread importiert sie mit Anführungszeichen - aber wie kann ich dieses Verhalten ändern? Ein Grund ist, dass ich Spaltennamen habe, die mit einem Leerzeichen beginnen, und ich weiß nicht, wie ich damit umgehen soll.

Alle Zeiger wären hilfreich.

Edit: Ein Beispiel.

> packageVersion("data.table") 
[1] ‘1.8.8’ 

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE) 

> head(p2p[,list(Principal remaining)]) 
Error: unexpected symbol in "head(p2p[,list(Principal remaining" 

> head(p2p[,list("Principal remaining")]) 
        V1 
1: Principal remaining 

> head(p2p[,list(c("Principal remaining"))]) 
        V1 
1: Principal remaining 

Was ich erwarte/will, ist natürlich, was für einen Spaltennamen ohne Leerzeichen ergeben:

> head(p2p[,list(Principal)]) 
    Principal 
1:  1000 
2:  1000 
3:  1000 
4:  2000 
5:  1000 
6:  4130 

Antwort

5

Es sollte ziemlich schwierig sein, einen führenden Platz in einem Spaltennamen zu erhalten. Sollte nicht durch "zufällige Codierung" geschehen. Auf der anderen Seite sehe ich nicht sehr viel Fehler in der fread Code überprüft, so vielleicht, bis dieses unerwünschte Verhalten festgelegt ist, (oder die Funktion Antrag abgelehnt), können Sie etwas tun können:

setnames(DT, make.names(colnames(DT))) 

Wenn Auf der anderen Seite stört Sie die Tatsache, dass colnames(DT) die Spaltennamen mit Anführungszeichen anzeigen und dann einfach "darüber hinwegkommen". So zeigt die interaktive Konsole einen beliebigen Zeichenwert an.

Wenn Sie ein Datenelement in einer Zeichenspalte, die wie " ttt" im Original aussieht, dann führende Leerzeichen zu haben, es geht, wenn importiert, und Sie müssen es mit colnames(dfrm) <- sub("^\\s+", "", colnames(dfrm)) oder einem der verschiedenen trim Funktionen in verschiedenen Paketen verarbeiten (wie 'gdata')

+0

Ich werde die Unter/gsub Route versuchen. Vielen Dank. – Rico

+0

Vielleicht möchten Sie Ihre Antwort damit aktualisieren. 'Warnmeldung: In Namen <-. Data.table (* tmp *, Wert = Wert): Die colnames (x) <- Wert-Syntax kopiert die gesamte Tabelle. Dies liegt an <- in R selbst. Bitte ändere zu setnames (x, alt, neu), die nicht kopieren und schneller sind. Siehe Hilfe ('Setnamen'). Sie können diese Warnung ignorieren, wenn es unbequem ist, sie gerade zu ändern. Das Setzen von Optionen (warn = 2) macht diese Warnung zu einem Fehler, so dass Sie traceback() verwenden können, um Ihre colnames <- Calls zu suchen und zu ändern. – Rico

+0

Ausgezeichneter Punkt, und ich habe die Antwort geändert, um das widerzuspiegeln. –

9

Ein wenig BondedDust Version geändert, weil setnames Funktion nicht mit < verwendet wird - Zeichen:

setnames(DT, make.names(colnames(DT)) 
+0

Gute Eins. David Arenburg repariert. Es ist mir ziemlich peinlich, dass ich das gemacht habe und dass der Fehler über ein Jahr lang bestehen geblieben ist. –

0

können Sie Argument check.names verwenden = T in fread Funktion von data.table

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE, check.names=T) 

Es verwendet make.names Funktion im Hintergrund

default is FALSE. If TRUE then the names of the variables in the data.table 
are checked to ensure that they are syntactically valid variable names. If 
necessary they are adjusted (by make.names) so that they are, and also to 
ensure that there are no duplicates. 
Verwandte Themen