Read.CSV在R中没有按预期工作

Bti*_*rt3 7 csv r read.csv

我很难过.通常,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个逗号附加到其他行是否有误?如果可能的话,最好联系生成数据的人,以澄清歧义.


shh*_*its 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
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)