¿Cómo se puede leer un archivo CSV en R con diferente número de columnas

Tengo un conjunto de datos dispersos, uno cuyo número de columnas varía en longitud, en formato csv. Aquí hay una muestra del texto del archivo.

12223, University 12227, bridge, Sky 12828, Sunset 13801, Ground 14853, Tranceamerica 14854, San Francisco 15595, shibuya, Shrine 16126, fog, San Francisco 16520, California, ocean, summer, golden gate, beach, San Francisco 

Cuando uso

 read.csv("data.txt", header = F) 

R interpretará que el conjunto de datos tiene 3 columnas porque el tamaño se determina a partir de las primeras 5 filas. ¿Hay alguna forma de obligar a poner los datos en más columnas?

En lo profundo de la documentación de ?read.table hay lo siguiente:

El número de columnas de datos se determina mirando las primeras cinco líneas de entrada (o el archivo completo si tiene menos de cinco líneas), o desde la longitud de col.names si está especificado y es más largo. blank.lines.skip are true , esto podría ser incorrecto si fill o blank.lines.skip are true , así que especifique col.names si es necesario (como en los ‘Ejemplos’).

Por lo tanto, defina col.names como la longitud X (donde X es el número máximo de campos en su conjunto de datos) y establezca fill = TRUE :

 dat < - textConnection("12223, University 12227, bridge, Sky 12828, Sunset 13801, Ground 14853, Tranceamerica 14854, San Francisco 15595, shibuya, Shrine 16126, fog, San Francisco 16520, California, ocean, summer, golden gate, beach, San Francisco") read.table(dat, header = FALSE, sep = ",", col.names = paste0("V",seq_len(7)), fill = TRUE) V1 V2 V3 V4 V5 V6 V7 1 12223 University 2 12227 bridge Sky 3 12828 Sunset 4 13801 Ground 5 14853 Tranceamerica 6 14854 San Francisco 7 15595 shibuya Shrine 8 16126 fog San Francisco 9 16520 California ocean summer golden gate beach San Francisco 

Si se desconoce el número máximo de campos, puede usar la función de utilidad nifty count.fields (que encontré en el código de ejemplo read.table ):

 count.fields(dat, sep = ',') # [1] 2 3 2 2 2 2 3 3 7 max(count.fields(dat, sep = ',')) # [1] 7 

Lectura relacionada posiblemente útil: solo lea el número limitado de columnas en R

Podrías leer los datos de esta manera:

 dat < - textConnection("12223, University 12227, bridge, Sky 12828, Sunset 13801, Ground 14853, Tranceamerica 14854, San Francisco 15595, shibuya, Shrine 16126, fog, San Francisco 16520, California, ocean, summer, golden gate, beach, San Francisco") dat <- readLines(dat) dat <- strsplit(dat, ",") 

Esto da como resultado una lista.

Esto parece funcionar (siguiendo la sugerencia de @ BlueMagister):

 tt < - read.table("~/Downloads/tmp.csv", fill=TRUE, header=FALSE, sep=",", colClasses=c("numeric", rep("character", 6))) names(tt) <- paste("V", 1:7, sep="") V1 V2 V3 V4 V5 V6 V7 1 12223 University 2 12227 bridge Sky 3 12828 Sunset 4 13801 Ground 5 14853 Tranceamerica 6 14854 San Francisco 7 15595 shibuya Shrine 8 16126 fog San Francisco 9 16520 California ocean summer golden gate beach San Francisco