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 sifill
oblank.lines.skip are true
, así que especifiquecol.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.