2012-08-15 11 views
7

Estoy perplejo. Normalmente, read.csv funciona como se esperaba, pero me he encontrado con un problema donde el comportamiento es inesperado. Lo más probable es que sea un error del usuario de mi parte, pero cualquier ayuda será apreciada.Read.CSV no funciona como se esperaba en R

Aquí está la dirección del archivo

http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip 

Aquí está mi código para obtener el archivo, descomprimirlo, y leerlo en:

URL <- "http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip" 
download.file(URL, destfile="temp.zip") 
unzip("temp.zip") 
tmp <- read.table("sfa0910.csv", 
        header=T, stringsAsFactors=F, sep=",", row.names=NULL) 

Aquí es mi problema. Cuando abro los datos de csv de datos en Excel, los datos se ven como se esperaba. Cuando leo los datos en R, la primera columna se llama row.names. R está leyendo en una fila adicional de datos, pero no puedo entender dónde ocurre el "error" que está causando que row.names sea una columna. Simplemente, parece que los datos cambiaron.

Sin embargo, lo extraño es que la última columna en R parece contener los datos adecuados.

Éstos son un par de filas de las primeras columnas:

tmp[1:5,1:7] 
    row.names UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP 
1 100654  R  4496  R  1044  R  23 
2 100663  R 10646  R  1496  R  14 
3 100690  R  380  R  5  R  1 
4 100706  R  6119  R  774  R  13 
5 100724  R  4638  R  1209  R  26 

alguna idea de lo que podría estar haciendo mal?

+4

Nunca suponga que Excel representa correctamente el contenido de su archivo CSV. Abra el CSV en un editor de texto (no es que esta sea la causa de su problema, sino como una regla general). –

+0

elimina el argumento 'row.names = NULL'. – mnel

+0

@ttmaccer - es extraño, no necesita autenticarse en el sitio. Lo intenté desde la web y lo descargué automáticamente en mi computadora. Estoy usando Chrome. – Btibert3

Respuesta

5

que tienen un arreglo tal vez basado en los comentarios de mnel

dat<-readLines(paste("sfa", '0910', ".csv", sep="")) 
ncommas<-sapply(seq_along(dat),function(x){sum(attributes(gregexpr(',',dat[x])[[1]])$match.length)}) 
> head(ncommas) 
[1] 450 451 451 451 451 451 

todas las columnas después de la primera tener un separador adicional que Excel omite.

for(i in seq_along(dat)[-1]){ 
dat[i]<-gsub('(.*),','\\1',dat[i]) 
} 
write(dat,'temp.csv') 

tmp<-read.table('temp.csv',header=T, stringsAsFactors=F, sep=",") 

> tmp[1:5,1:7] 
    UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP SCUGFFP 
1 100654  R 4496  R 1044  R  23 
2 100663  R 10646  R 1496  R  14 
3 100690  R  380  R  5  R  1 
4 100706  R 6119  R  774  R  13 
5 100724  R 4638  R 1209  R  26 

la moraleja de la historia .... escuchar a Joshua Ulrich;)

solución rápida. Abra el archivo en Excel y guárdelo. Esto también eliminará los separadores adicionales.

Alternativamente

dat<-readLines(paste("sfa", '0910', ".csv", sep=""),n=1) 
dum.names<-unlist(strsplit(dat,',')) 
tmp <- read.table(paste("sfa", '0910', ".csv", sep=""), 
        header=F, stringsAsFactors=F,col.names=c(dum.names,'XXXX'),sep=",",skip=1) 
tmp1<-tmp[,-dim(tmp)[2]] 
+0

¡Buena llamada! Este fue también mi problema exacto – ZnArK

17

Mi consejo: utiliza count.fields() como un diagnóstico rápido cuando los archivos delimitados no se comportan como se esperaba.

En primer lugar, contar el número de campos utilizando tabla():

table(count.fields("sfa0910.csv", sep = ",")) 
# 451 452 
# 1 6852 

que te dice que todas menos una de las líneas contiene 452 campos. Entonces, ¿cuál es la línea aberrante?

which(count.fields("sfa0910.csv", sep = ",") != 452) 
# [1] 1 

La primera línea es el problema. En la inspección, todas las líneas, excepto la primera, terminan con 2 comas.

La pregunta ahora es: ¿qué significa eso? ¿Se supone que hay un campo adicional en la fila del encabezado que se omitió? ¿O fueron las 2 comas añadidas a las otras líneas por error? Puede ser mejor contactar a quien generó los datos, si es posible, para aclarar la ambigüedad.

+1

+1 para resaltar 'count.fields'. Una buena función para este tipo de procesamiento por el aspecto de la misma. – thelatemail

0

sé que has encontrado una respuesta, pero como su respuesta me ayudó a descubrir esto, voy a compartir:

Si se lee en I un archivo con diferente cantidad de columnas para diferentes filas, como este :

1,2,3,4,5 
1,2,3,4 
1,2,3 

sería lectura en el llenado de las columnas que faltan con AN, así:

1,2,3,4,5 
1,2,3,4,NA 
1,2,3,NA,NA 

pero! Si la fila con las mayores columnas no es la primera fila, como esto:

1,2,3,4 
1,2,3,4,5 
1,2,3 

entonces sería ser leído de una manera confusa bits:

1,2,3,4 
1,2,3,4 
5,NA,NA,NA 
1,2,3,NA 

(abrumadora antes de averiguar la problema y bastante simple después!)

¡Espero que ayude a alguien!

Cuestiones relacionadas