2012-08-15 11 views
7

Jestem zaskoczony. Normalnie, read.csv działa zgodnie z oczekiwaniami, ale napotkałem problem, w którym zachowanie jest nieoczekiwane. Najprawdopodobniej jest to błąd użytkownika z mojej strony, ale każda pomoc zostanie doceniona.Read.CSV nie działa zgodnie z oczekiwaniami w R

Oto adres URL pliku

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

Oto mój kod, aby pobrać plik, rozpakuj i czytaj je w:

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) 

Oto mój problem. Po otwarciu danych CSV danych w programie Excel dane wyglądają zgodnie z oczekiwaniami. Kiedy czytam dane do R, pierwsza kolumna jest faktycznie nazwana row.names. R czyta w jednym rzędzie danych, ale nie wiem, gdzie pojawia się "błąd", który powoduje, że row.names jest kolumną. Po prostu wygląda na to, że dane zostały przesunięte.

Jednak dziwne jest to, że ostatnia kolumna w R wydaje się zawierać właściwe dane.

Oto kilka wierszy z pierwszych kilku kolumnach:

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 

jakieś przemyślenia na temat tego, co mogę robić źle?

+4

Nie zakładaj, że program Excel poprawnie reprezentuje zawartość pliku CSV. Otwórz plik CSV w edytorze tekstów (nie to jest przyczyną problemu, ale z reguły). –

+0

usuwa argument 'row.names = NULL'. – mnel

+0

@ttmaccer - to dziwne, nie musisz uwierzytelniać się na stronie. Po prostu wypróbowałem to z internetu i automatycznie pobrałem plik na mój komputer. Używam Chrome. – Btibert3

Odpowiedz

5

mam dylemat może na podstawie uwag mnel męska

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 

wszystkich kolumnach po pierwsze mają dodatkowy separator który excel ignoruje.

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 

Morał z tej historii .... słuchać Joshua Ulrich;)

Quick Fix. Otwórz plik w programie Excel i zapisz go. Spowoduje to również usunięcie dodatkowych separatorów.

Alternatywnie

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

Dobra rozmowa! To był mój dokładny problem, a także – ZnArK

17

Moja rada: używaj count.fields() jako szybki diagnostyczny gdy wyznaczone pliki nie zachowują się zgodnie z oczekiwaniami.

pierwsze, policzyć liczbę pól korzystających tabeli():

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

, który mówi, że wszystkich, ale jeden z wierszy zawiera 452 pól. A więc jaka jest nienormalna linia?

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

Pierwsza linia to problem. Podczas kontroli wszystkie linie z wyjątkiem pierwszego są zakończone 2 przecinkami.

Pytanie brzmi: co to znaczy? Czy w wierszu nagłówka powinno znajdować się dodatkowe pole, które zostało pominięte? A może dwa błędy zostały dołączone do innych linii? Najlepszym rozwiązaniem może być skontaktowanie się z osobami, które wygenerowały dane, jeśli to możliwe, w celu wyjaśnienia niejednoznaczności.

+1

+1 dla podświetlenia 'count.fields'. Dobra funkcja dla tego rodzaju przetwarzania przez jej wygląd. – thelatemail

0

wiem, że znalazłem odpowiedź, ale jako odpowiedź pomógł mi dowiedzieć się tego, będę dzielić:

Jeśli czytasz na R plik z różnej ilości kolumn dla poszczególnych wierszy, podobnie jak to :

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

byłoby czytać w wypełnieniu brakujące kolumny z agencji krajowych, jak to:

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

ALE! Jeśli rząd z największymi kolumnami nie jest pierwszym rzędzie tak:

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

wtedy byłoby czytać w nieco mylący sposób:

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

(przytłaczająca zanim dowiedzieć się problem i dość prosty po!)

Po prostu mam nadzieję, że może komuś pomóc!

Powiązane problemy