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
什么我可能做错了什么想法?
我有一个修复也许基于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]]
好电话!这是我的确切问题以及 – 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,用于突出显示'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
(压倒你弄清楚之前,问题和后相当简单!)
只是希望它可以帮助别人!
永远不要假设Excel正确表示您的CSV文件的内容。相反,在文本编辑器中打开CSV(不是这是造成问题的原因,而是作为一般规则)。 – 2012-08-15 23:36:45
删除'row.names = NULL'参数。 – mnel 2012-08-15 23:39:09
@ttmaccer - 这很奇怪,你不需要验证到网站。我只是从网上试过,并将文件自动下载到我的电脑。我正在使用Chrome。 – Btibert3 2012-08-15 23:41:01