2012-08-15 108 views
7

我很難過。通常情況下,read.csv按預期工作,但我遇到了行爲出乎意料的問題。它很可能是我的用戶錯誤,但任何幫助將不勝感激。Read.CSV在R中未按預期工作

下面是對文件

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

的URL這裏是我的代碼來獲取文件,解壓縮,並在閱讀:

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) 

這裏是我的問題。當我在Excel中打開數據CSV數據時,數據看起來像預期的那樣。當我將數據讀入R時,第一列實際上被命名爲row.names。 R正在讀取一行額外的數據,但我無法弄清楚發生「錯誤」的原因是導致row.names成爲列。簡單地說,它看起來像數據轉移。

但是,奇怪的是,R中的最後一列似乎包含正確的數據。

以下是第幾列幾行:

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 

什麼我可能做錯了什麼想法?

+4

永遠不要假設Excel正確表示您的CSV文件的內容。相反,在文本編輯器中打開CSV(不是這是造成問題的原因,而是作爲一般規則)。 – 2012-08-15 23:36:45

+0

刪除'row.names = NULL'參數。 – mnel 2012-08-15 23:39:09

+0

@ttmaccer - 這很奇怪,你不需要驗證到網站。我只是從網上試過,並將文件自動下載到我的電腦。我正在使用Chrome。 – Btibert3 2012-08-15 23:41:01

回答

5

我有一個修復也許基於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 

所有列第一有一個額外的分隔符,其擅長忽略。

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 

這個故事的寓意....聽約書亞烏爾裏希;)

快速修復。在Excel中打開文件並保存。這也會刪除額外的分隔符。

或者

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

好電話!這是我的確切問題以及 – ZnArK 2013-03-07 04:36:47

17

我的技巧:使用count.fields()作爲一種快速診斷時預期分隔的文件不規矩。

首先,計算使用表(場數)

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

,告訴您所有,但該行的一個包含452場。那麼哪個是異常線?

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

第一行是問題。在檢查時,除第一行之外的所有行都以2個逗號結尾。

現在的問題是:這是什麼意思?是否應該在標題行中有一個被省略的額外字段?還是2個逗號附加到其他行錯誤?如果可能的話,最好與任何產生數據的人聯繫,以澄清含糊不清。

+1

+1,用於突出顯示'count.fields'。這種處理的外觀很好用。 – thelatemail 2012-08-16 02:23:38

0

我知道你已經找到了答案,但因爲你的回答幫我找出這個,我給大家介紹:

如果你讀成R與不同量的不同行的列的,像這樣的文件:

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

它會被讀入爲NAS填充缺失的字段,如:

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

BUT! 如果與最大的列行不是第一行,像這樣:

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

那麼它會在一個比較混亂的方式讀取:

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

(壓倒你弄清楚之前,問題和後相當簡單!)

只是希望它可以幫助別人!