2015-01-07 6 views
7

Ich habe eine kleine Daten aus einer Textdatei über readLines lesen. Die Datei hatte Zeichen wie # und ich denke, das ist der Grund, warum read.table es nicht lesen konnte. Hier werden die ersten fünf Zeilen dput:Split String Linien und einen Datenrahmen

files<-c("\trfinal\t\t", "eq1\t\t\t", "0.ster6\t1.00\t(1.00,1.00)\t.", 
    "1.ster6\t0.65\t(0.47,0.88)\t0.006", "0.parkinson\t1.00\t(1.00,1.00)\t.", 
    "1.ster6#0.parkinson\t1.00\t(1.00,1.00)\t.") 

\t weißen Raum zwischen Saiten bedeuten. Ich möchte diese Textzeilen teilen und sie in ein 4-Spalten-Raster (Datenrahmen) setzen.

Ich versuchte strsplit(files, "[\\t]"), aber es tut nicht wirklich den Trick. Irgendeine Hilfe ?

Antwort

8

Sie können die Behandlung von # als comment.char in read.table deaktivieren:

read.table(text=files, sep='\t', comment.char="") 
#     V1  V2   V3 V4 
# 1      rfinal 
# 2     eq1 
# 3    0.ster6 1.00 (1.00,1.00)  . 
# 4    1.ster6 0.65 (0.47,0.88) 0.006 
# 5   0.parkinson 1.00 (1.00,1.00)  . 
# 6 1.ster6#0.parkinson 1.00 (1.00,1.00)  . 
+1

Ich denke, es wäre besser für sie das Problem an der Quelle zu beheben (+1), aber ihr gewünschter Ausgang bleibt etwas unklar. – A5C1D2H2I1M1N2O1R2T1

+0

Vielen Dank an euch beide. Beide Lösungen haben gut funktioniert. – JeanVuda

7

Wenn die "\t" nur eine Registerkarte Trennzeichen darstellt, versuchen read.delim:

read.delim(text = files) 
#      X rfinal   X.1 X.2 
# 1     eq1  NA     
# 2    0.ster6 1.00 (1.00,1.00)  . 
# 3    1.ster6 0.65 (0.47,0.88) 0.006 
# 4   0.parkinson 1.00 (1.00,1.00)  . 
# 5 1.ster6#0.parkinson 1.00 (1.00,1.00)  . 

Sie können auch die stringi Paket betrachten. Hier habe ich die "\t" als festes Muster behandelt:

library(stringi) 
stri_split_fixed(files, "\t", simplify = TRUE) 
#  [,1]     [,2]  [,3]   [,4] 
# [1,] ""     "rfinal" ""   ""  
# [2,] "eq1"     ""  ""   ""  
# [3,] "0.ster6"    "1.00" "(1.00,1.00)" "."  
# [4,] "1.ster6"    "0.65" "(0.47,0.88)" "0.006" 
# [5,] "0.parkinson"   "1.00" "(1.00,1.00)" "."  
# [6,] "1.ster6#0.parkinson" "1.00" "(1.00,1.00)" "." 

Insgesamt aber es ist nicht klar, was soll als Überschrift behandelt werden und so weiter, und es wäre besser, @ musically_ut Vorschlag zur Umsetzung über die Verwendung von comment.char und versuchen, das Problem an der Quelle zu lösen.