2011-12-07 24 views
5

Tengo un registro telefónico muy largo como archivo de texto y he intentado leerlo en R, pero en realidad no funciona. El texto tiene una estructura, pero ciertamente no es una tabla. Su estructura es la siguienteCómo leo un archivo de texto en R cuando los datos no están en una tabla

  1. Cada registro se compone de varias líneas de modo readlines no es muy apropiado
  2. Cada línea de cada registro es un campo separado
  3. Algunos registros tienen un campo adicional después de que el segundo campo
  4. Cada nuevo registro se indica con una línea en blanco. readLines o scan habría funcionado si se podría haber especificado que los registros fueron separados por "\ n \ n" y que los campos (o columnas) fueron separados por "\ n"

Aquí se muestra un ejemplo:

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 

¿Cómo puedo hacer esto en R? He intentado trucos con escanear, pegar, strsplit pero estoy girando en círculos. Es posible que deba incluirlo en una lista, ya que puede manejar una cantidad no igual de elementos. Me gustaría obtener todos los registros para tener el mismo número de campos y para aquellos registros que no tienen un campo (aquí llamado bump phone) me gustaría que solo tengan una NA como valor en ese campo. Agradecería ayuda incluso para comenzar. Desde allí puedo jugar y jugar.

Respuesta

14

Con multi.line = TRUE en la función scan, un registro debe finalizar con dos finales de línea. Lo hice con textConnection alrededor de su archivo, pero usaría un nombre de archivo válido:

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 Muy bonito ... – Andrie

+0

... pero supongo que tiene que dividen además place' '' tline' y 'cline1' en sub columnas? – Tommy

+0

Creo que la próxima tarea sería pasar los datos de "fecha y hora" y "líneas de respuesta", pero no creo que el interlocutor haya pedido analizar los comentarios. –

Cuestiones relacionadas