2011-12-07 18 views
5

Ho ottenuto un registro telefonico molto lungo come file di testo e ho provato a leggerlo in R, ma non sta funzionando. Il testo ha una struttura ma non è certamente un tavolo. La sua struttura è la seguenteCome leggo un file di testo in R quando i dati non sono in una tabella

  1. Ogni record è composto da più linee in modo readlines non è abbastanza adeguata
  2. Ogni riga di ciascun record è un campo separato
  3. Alcuni documenti hanno un campo aggiuntivo dopo il secondo campo
  4. Ogni nuovo record è contrassegnato da una riga vuota. readLines o scan avrebbe funzionato se si sarebbe potuto specificato che i record sono stati separati da "\ n \ n" e che i campi (o colonne) sono stati separati da "\ n"

Ecco un esempio:

TheInstitute 5467 
    telephone line 4125526987 x 4567 
    datetime 2011110516 12:56 
    blay blay blah who knows what, but anyway it may have a comma 

TheInstitute 5467 
    telephone line 4125526987 x 4567 
    datetime 2011110516 12:58 
    blay blay blah who knows what 

TheInstitute 5467 
    telephone line 412552999 x 4999 
    bump phone line 4125527777 
    datetime 2011110516 12:59 
    blay blay blah who knows what 

TheInstitute 5467 
    telephone line 4125526987 x 4567 
    bump phone line 4125527777 
    datetime 2011110516 13:51 
    blay blay blah who knows what, but anyway it may have a comma 

TheInstitute 5467 
    telephone line 4125526987 x 4567 
    datetime 2011110516 14:56 
    blay blay blah who knows what 

Come posso farlo in R? Ho provato trucchi con scan, paste, strsplit ma sto girando in tondo. Potrei doverlo inserire in una lista poiché è in grado di gestire un numero non uguale di elementi. Vorrei avere tutti i record per avere lo stesso numero di campi e per quei record che non hanno lo stesso campo (qui chiamato bump phone) mi piacerebbe loro solo avere un NA come valore in quel campo. Apprezzerei l'aiuto anche solo per iniziare. Da lì posso giocare e giocare.

risposta

14

Con multi.line = TRUE nella funzione scan, un record dovrebbe terminare con due estremità di linea. L'ho fatto con textConnection intorno al vostro file, ma si può usare un nome di file valido:

inp <- scan(textConnection(txt), multi.line=TRUE, 
      what=list(place="character", tline1="character", 
      cline1="character", cline2 ="character", cline3="character"), sep="\n") 
Read 5 records 
> str(as.data.frame(inp)) 
'data.frame': 5 obs. of 5 variables: 
$ place : Factor w/ 1 level "TheInstitute 5467": 1 1 1 1 1 
$ tline1: Factor w/ 2 levels " telephone line 4125526987 x 4567",..: 1 1 2 1 1 
$ cline1: Factor w/ 4 levels " bump phone line 4125527777",..: 2 3 1 1 4 
$ cline2: Factor w/ 4 levels " blay blay blah who knows what",..: 2 1 3 4 1 
$ cline3: Factor w/ 3 levels ""," blay blay blah who knows what",..: 1 1 2 3 1 
> as.data.frame(inp) 
       place        tline1 
1 TheInstitute 5467 telephone line 4125526987 x 4567 
2 TheInstitute 5467 telephone line 4125526987 x 4567 
3 TheInstitute 5467 telephone line 412552999 x 4999 
4 TheInstitute 5467 telephone line 4125526987 x 4567 
5 TheInstitute 5467 telephone line 4125526987 x 4567 
         cline1 
1 datetime 2011110516 12:56 
2 datetime 2011110516 12:58 
3 bump phone line 4125527777 
4 bump phone line 4125527777 
5 datetime 2011110516 14:56 
                  cline2 
1 blay blay blah who knows what, but anyway it may have a comma 
2         blay blay blah who knows what 
3          datetime 2011110516 12:59 
4          datetime 2011110516 13:51 
5         blay blay blah who knows what 
                  cline3 
1                 
2                 
3         blay blay blah who knows what 
4 blay blay blah who knows what, but anyway it may have a comma 
5                 
+0

+1 Bellissima ... – Andrie

+0

... ma credo che avete bisogno di ulteriore spaccatura 'place',' tline' e 'cline1' in sub colonne? – Tommy

+0

Penso che il prossimo compito sarebbe quello di spostare i dati "datetime" e "bump lines", ma non pensavo che l'interrogante chiedesse di analizzare i commenti. –

Problemi correlati