Importar datos en R con un número desconocido de columnas?

Intento leer un archivo de texto con diferentes longitudes de fila:

1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 

Para superar este problema, estoy usando el argumento fill = TRUE en read.table, entonces:

 data<-read.table("test",sep="\t",fill=TRUE) 

Desafortunadamente, para evaluar la longitud máxima de la fila, read.table lee solo las primeras 5 líneas del archivo y genera un objeto que se ve así:

 data V1 V2 V3 V4 V5 1 1 NA NA NA NA 2 1 2 NA NA NA 3 1 2 3 NA NA 4 1 2 3 4 NA 5 1 2 3 4 5 6 1 2 3 4 5 7 6 NA NA NA NA 8 1 2 3 4 5 9 6 7 NA NA NA 10 1 2 3 4 5 11 6 7 8 NA NA 

¿Hay alguna manera de obligar a read.table a desplazarse por todo el archivo para evaluar la longitud máxima de fila? Sé que una posible solución sería proporcionar el número de columna, como:

 data<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:8)) 

Pero dado que tengo muchos archivos, quería evaluar esto automáticamente en R. ¿Alguna sugerencia? 🙂


EDITAR: el archivo original no contiene números progresivos, por lo que esta no es una solución:

 data1<-read.table("test",sep="\t",fill=TRUE) data2<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:max(data1)) 

Hay una buena función count.fields (ver ayuda) que cuenta el número de columnas por fila:

 count.fields("test", sep = "\t") #[1] 1 2 3 4 5 6 7 8 

Entonces, usando tu segunda solución:

 no_col < - max(count.fields("test", sep = "\t")) data <- read.table("test",sep="\t",fill=TRUE,col.names=1:no_col) data # X1 X2 X3 X4 X5 X6 X7 X8 # 1 1 NA NA NA NA NA NA NA # 2 1 2 NA NA NA NA NA NA # 3 1 2 3 NA NA NA NA NA # 4 1 2 3 4 NA NA NA NA # 5 1 2 3 4 5 NA NA NA # 6 1 2 3 4 5 6 NA NA # 7 1 2 3 4 5 6 7 NA # 8 1 2 3 4 5 6 7 8 

Usar count.fields es definitivamente el enfoque correcto para esto, pero solo para completarlo:

Otra opción es traer todo el texto sin formato y analizarlo en R:

 x < - readLines(textConnection( "1\t 1\t2 1\t2\t3 1\t2\t3\t4 1\t2\t3\t4\t5 1\t2\t3\t4\t5\t6")) x <- strsplit(x,"\t") 

Para combinar una lista de vectores de longitud desiguales, el enfoque más fácil es utilizar la función plyr de plyr :

 library(plyr) # requires data.frames with column names x < - lapply(x,function(x) {x <- as.data.frame(t(x)); colnames(x)=1:length(x); return(x)}) do.call(rbind.fill,x) 1 2 3 4 5 6 1 1      2 1 2     3 1 2 3    4 1 2 3 4   5 1 2 3 4 5  6 1 2 3 4 5 6