trabajar studio leer importar exportar desde datos con commander cargar r csv import read.table sparse-columns

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



leer csv en r (3)

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


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


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.