2016-03-21 4 views
0

Ich muss eine Tabelle mit den folgenden Daten erstellen (ich möchte keine CSV verwenden, um es zu importieren).R-Text-Verbindung

toread<-"DomicLabProv cluster 
BUENOS AIRES 1 
CHUBUT 1 
FORMOSA 1 
LA PAMPA 1 
SAN JUAN 1 
CAPITAL FEDERAL 1 
MISIONES 1 
SAN LUIS 1 
SANTA FE 1 
ENTRE RIOS 2 
JUJUY 2 
LA RIOJA 2 
SANTIAGO DEL ESTERO 2 
CHACO 2 
CORDOBA 2 
CORRIENTES 2 
SALTA 2 
TIERRA DEL FUEGO 2 
TUCUMAN 2 
CATAMARCA 3 
MENDOZA 3 
NEUQUEN 3 
RIO NEGRO 3 
SANTA CRUZ 3 
" 

Wie Sie sehen können, sind die ersten und zweiten Felder durch Tabulatoren getrennt. Wenn ich versuche:

read.table(textConnection(toread), header = TRUE) 

bekomme ich folgende Fehler mesage:

Fehler bei Scan. Zeile 2 hat keine 2 Elemente.

Ich denke, das hängt damit zusammen, dass Namen in DomicLabProv Leerzeichen haben, zum Beispiel "Buenos Aires". Gibt es eine Möglichkeit, dieses Problem zu überwinden? Ich meine, das sind Leerzeichen, die mit der Leertaste gemacht werden, und diejenigen, die zwischen den Feldern liegen, werden mit der Tabulatortaste ausgeführt.

Danke.

+1

Ersetzen Sie Ihre abgrenzt Räume durch einen ',' und füge 'sep = ','' in deine read.table hinzu – HubertL

Antwort

3

Keine Notwendigkeit für eine textConnection; übergeben Sie die Zeichenfolge an die Funktion read.table über die text Option statt:

read.delim(text = toread) 

(. read.delim ist die gleiche wie read.table sondern verwendet Tabs als Trennzeichen, und standardmäßig auf einen Header mit)

Dies funktioniert, wenn Ihr Text wird in der Tat durch das Tabulatorzeichen '\t' begrenzt. Wenn dies nicht der Fall ist, ist ein bisschen mehr Arbeit erforderlich, da Sie die Spalten manuell teilen müssen, während Sie darauf achten, keine Felder wie "LA PAMPA" aufzuteilen, die ebenfalls ein Leerzeichen enthalten. Dies ist schwierig und am besten zu vermeiden, wenn Sie die Daten im richtigen Format haben. In Ihrem speziellen Fall können wir die Informationen verwenden, die in der zweiten Spalte numerisch ist (aber wir zuerst den Header entfernen müssen, da dieser nicht entspricht):

header = strsplit(sub('\n.*', '', toread), ' +')[[1]] 
no_header = sub('^.*?\n', '', toread) 
no_header = gsub(' +(?=\\d)', '\t', no_header, perl = TRUE) 
data = read.delim(text = no_header, header = FALSE) 
colnames(data) = header 
+0

Danke, aber das Ergebnis teilt Spalten nicht auf. Ich bekomme: DomicLabProvcluster 1 BUENOS AIRES1 2 CHUBUT1 – GabyLP

+0

@GabyLP Dann sind Ihre Daten nicht tatsächlich Tab-getrennt wie behauptet. Meine Antwort befasst sich jedoch damit. Das Kopieren und Einfügen Ihrer Daten in R und das anschließende Ausführen des zweiten Codeabschnitts funktioniert auf jeden Fall. –

+0

Sie haben Recht. Ich habe die Daten aus einer Excel-Tabelle kopiert, und ich vermutete, dass sie durch Tabulatoren getrennt wurden. Ich habe das überprüft, jedes Leerzeichen gelöscht und die Tabulatortaste gedrückt und immer noch das falsche Ergebnis erhalten. Ich habe nur von hier kopiert und gearbeitet. Kann nicht erklären warum. Vielleicht hat jemand den Text bearbeitet. – GabyLP

-1

Mit etwas regex, können wir es in das CSV-Format konvertieren:

read.csv(text = sub('\\s+(\\S+$)', ',\\1', readLines(textConnection(toread)))) 
#   DomicLabProv cluster 
# 1   BUENOS AIRES  1 
# 2    CHUBUT  1 
# 3    FORMOSA  1 
# 4    LA PAMPA  1 
# 5    SAN JUAN  1 
# 6  CAPITAL FEDERAL  1 
# 7    MISIONES  1 
# 8    SAN LUIS  1 
# 9    SANTA FE  1 
# 10   ENTRE RIOS  2 
# 11    JUJUY  2 
# 12   LA RIOJA  2 
# 13 SANTIAGO DEL ESTERO  2 
# 14    CHACO  2 
# 15    CORDOBA  2 
# 16   CORRIENTES  2 
# 17    SALTA  2 
# 18 TIERRA DEL FUEGO  2 
# 19    TUCUMAN  2 
# 20   CATAMARCA  3 
# 21    MENDOZA  3 
# 22    NEUQUEN  3 
# 23   RIO NEGRO  3 
# 24   SANTA CRUZ  3 

sub sucht Leerzeichen \\s+ von einer Gruppe gefolgt, die es (...) erfasst, die \\S+ gefolgt von der aber Leerzeichen nichts besteht Ende der Zeile $. Ersetzt sie durch ein Komma , gefolgt von der erfassten Gruppe \\1.