我很难过.通常,read.csv按预期工作,但我遇到了行为意外的问题.这很可能是我的用户错误,但任何帮助将不胜感激.
这是文件的URL
http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip
Run Code Online (Sandbox Code Playgroud)
这是我的代码来获取文件,解压缩并读取它:
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)
Run Code Online (Sandbox Code Playgroud)
这是我的问题.当我在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
Run Code Online (Sandbox Code Playgroud)
关于我可能做错什么的任何想法?
nei*_*fws 17
我的提示:当分隔文件的行为不符合预期时,使用count.fields()作为快速诊断.
首先,使用table()计算字段数:
table(count.fields("sfa0910.csv", sep = ","))
# 451 452
# 1 6852
Run Code Online (Sandbox Code Playgroud)
这告诉你除了其中一行之外的所有行都包含452个字段.哪个是异常线?
which(count.fields("sfa0910.csv", sep = ",") != 452)
# [1] 1
Run Code Online (Sandbox Code Playgroud)
第一行是问题.在检查时,除第一行之外的所有行都以2个逗号结尾.
现在的问题是:这是什么意思?是否应该在标题行中有一个额外的字段被省略?或者是2个逗号附加到其他行是否有误?如果可能的话,最好联系生成数据的人,以澄清歧义.
我有一个修复可能基于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
Run Code Online (Sandbox Code Playgroud)
第一个之后的所有列都有一个excel忽略的额外分隔符.
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
Run Code Online (Sandbox Code Playgroud)
故事的寓意......听约书亚乌尔里希;)
快速解决.在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]]
Run Code Online (Sandbox Code Playgroud)