2012-08-15 9 views
7

Ich bin ratlos. Normalerweise funktioniert read.csv wie erwartet, aber ich bin auf ein Problem gestoßen, bei dem das Verhalten unerwartet ist. Es ist wahrscheinlich Benutzerfehler meinerseits, aber jede Hilfe wird geschätzt.Read.CSV funktioniert nicht wie erwartet in R

Dies ist die URL für die Datei ist

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

Hier ist mein Code, um die Datei zu erhalten, entpacken, und lesen Sie es in:

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) 

Hier ist mein Problem. Wenn ich die Daten-CSV-Daten in Excel öffne, sehen die Daten wie erwartet aus. Wenn ich die Daten in R lese, heißt die erste Spalte eigentlich row.names. R liest in einer zusätzlichen Datenzeile, aber ich kann nicht herausfinden, wo der "Fehler" auftritt, der dazu führt, dass row.names eine Spalte ist. Es sieht einfach so aus, als würden sich die Daten verschieben.

Was jedoch seltsam ist, ist, dass die letzte Spalte in R scheint die richtigen Daten zu enthalten.

Hier sind ein paar Zeilen aus den ersten paar Spalten:

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 

Irgendwelche Gedanken auf, was ich falsch tun könnte?

+4

Gehen Sie niemals davon aus, dass Excel den Inhalt Ihrer CSV-Datei korrekt darstellt. Öffnen Sie stattdessen die CSV-Datei in einem Texteditor (nicht, dass dies die Ursache Ihres Problems ist, sondern als allgemeine Regel). –

+0

Entfernen Sie das Argument 'row.names = NULL'. – mnel

+0

@ttmaccer - das ist seltsam, Sie müssen nicht auf der Website authentifizieren. Ich habe es gerade aus dem Internet ausprobiert und die Datei automatisch auf meinen Computer heruntergeladen. Ich verwende Chrome. – Btibert3

Antwort

5

Ich habe ein Update vielleicht basierend auf MNEL Kommentare

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 

alle Spalten nach der ersten eine zusätzliche seperator, die ignoriert Excel haben.)

Quick Fix;

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 

die Moral der Geschichte .... Joshua Ulrich hört. Öffnen Sie die Datei in Excel und speichern Sie sie. Dadurch werden auch die zusätzlichen Trennzeichen gelöscht.

Alternativ

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

Guter Anruf! Das war genau mein Problem – ZnArK

17

Mein Tipp: count.fields() als schnelle Diagnose verwenden, wenn getrennte Dateien verhalten sich nicht wie erwartet.

Zuerst zählen die Anzahl der Felder mit Tabelle():

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

, der Ihnen sagt, dass alle bis auf eine der Linien 452 Felder enthält. Also, was ist die abwegige Linie?

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

Die erste Zeile ist das Problem. Bei der Überprüfung werden alle Zeilen außer der ersten mit 2 Kommas abgeschlossen.

Die Frage ist jetzt: Was bedeutet das? Soll in der Kopfzeile ein zusätzliches Feld enthalten sein, das weggelassen wurde? Oder wurden die 2 Kommas fälschlicherweise an die anderen Zeilen angehängt? Es ist am besten, wenn möglich mit demjenigen Kontakt aufzunehmen, der die Daten generiert hat, um die Mehrdeutigkeit zu klären.

+1

+1 für die Hervorhebung von 'count.fields'. Eine nette Funktion für diese Art der Verarbeitung nach dem Aussehen. – thelatemail

0

Ich weiß, Sie haben eine Antwort gefunden, aber als Antwort hat mir geholfen, dies herauszufinden, werde ich teilen:

Wenn Sie lesen in R eine Datei mit unterschiedlicher Anzahl der Spalten für verschiedene Zeilen, wie dies :

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

es die fehlenden Spalten mit NAs schreib in würde Füllung, wie folgt aus:

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

ABER! Wenn die Zeile mit den größten Spalten nicht die erste Zeile, wie das ist:

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

dann wäre es ein bisschen verwirrend Weise gelesen werden:

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

(überwältigend, bevor Sie herausfinden, die Problem und ganz einfach nach!)

Ich hoffe nur, es kann jemandem helfen!

Verwandte Themen