2011-01-30 13 views
15

tengo un archivo de la siguiente manera:Leer un archivo de texto con número variable de columnas de una lista

mylist.txt 
234984 10354 41175 932711 426928 
1693237 13462 

Cada línea de este archivo tiene un número diferente de elementos, mínimo de 1 elemento por línea. me gustaría leerlo en una lista como esta:

> print(head(mylist,2)) 
[[1]] 
[1] 234984 10354 41175 932711 426928 

[[2]] 
[1] 1693237 13462 
+0

Desde sus elementos de la lista de ejemplo muestran espacios preservados entre los números, no está claro si desea que cada línea sea una cadena larga o un vector de números. –

+0

Vector de números. No estoy seguro de por qué muestra espacios. De todos modos, la respuesta aL3xa parece funcionar bastante bien. – pms

Respuesta

19

Suponiendo que el espacio es delimitador:

fc <- file("mylist.txt") 
mylist <- strsplit(readLines(fc), " ") 
close(fc) 

EDIT:

Si los valores están delimitados por varios espacios (una/o en forma unconsistent), puede hacer coincidir delimitador con expresión regular:

mylist.txt 
234984 10354 41175 932711  426928 
1693237    13462 

fc <- file("mylist.txt") 
mylist <- strsplit(readLines(fc), " +") 
close(fc) 

editar # 2

y desde strsplit devuelve cadenas, es necesario convertir sus datos a numérico (que es una tarea fácil):

mylist <- lapply(mylist, as.numeric) 
2

Una respuesta posible es leer primero una lista llena de AN y luego la eliminación de ellos de esta manera:

l<-as.list(as.data.frame(t(read.table("mylist.txt",fill=TRUE,col.names=1:max(count.fields("mylist.txt")))))) 
l<-lapply(l, function(x) x[!is.na(x)]) 

Me pregunto si hay es una forma más simple de hacerlo.

1

Usted podría simplificar la segunda línea mediante el uso de lapply en lugar de sapply

lapply(l, function(x)x[!is.na(x)]) 
+0

1. Lo necesita, de lo contrario read.table toma como un número de columnas para leer el número máximo de columnas en las primeras 5 líneas del archivo – pms

+0

@pms Ahh, mi archivo de prueba tenía el número máximo de columnas en la primera línea. He actualizado mi respuesta. – csgillespie

+0

2. Tiene razón, lo he editado, gracias por sus comentarios. – pms

Cuestiones relacionadas