Read.CSV在R中未按预期工作

问题描述:

我很难过。通常情况下,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

我有一个修复也许基于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

我的技巧:使用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

我知道你已经找到了答案,但因为你的回答帮我找出这个,我给大家介绍:

如果你读成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 

(压倒你弄清楚之前,问题和后相当简单!)

只是希望它可以帮助别人!